java编程实现算符优先分析法,编译原理实验三-算符优先分析法
编译原理实验3-算符优先分析法
#include
#include
#include
#include
#define SIZE 128
char priority[6][6]; //算符优先关系表数组
char input[SIZE]; //存放输入的要进行分析的句子
char remain[SIZE]; //存放剩余串
char AnalyseStack[SIZE]; //分析栈
void analyse();
int testchar(char x); //判断字符X在算符优先关系表中的位置
void remainString(); //移进时处理剩余字符串,即去掉剩余字符串第一个字符
int k;
void init()//构造算符优先关系表,并将其存入数组中
{
priority[1][0]='>';
priority[1][1]='>';
priority[1][2]='
priority[1][3]='
priority[1][4]='>';
priority[1][5]='>';
priority[2][0]='>';
priority[2][1]='>';
priority[2][2]='$';//无优先关系的用$表示
priority[2][3]='$';
priority[2][4]='>';
priority[2][5]='>';
priority[3][0]='
priority[3][1]='
priority[3][2]='
priority[3][3]='
priority[3][4]='=';
priority[3][5]='$';
priority[4][0]='>';
priority[4][1]='>';
priority[4][2]='$';
priority[4][3]='$';
priority[4][4]='>';
priority[4][5]='>';
priority[5][0]='
priority[5][1]='
priority[5][2]='
priority[5][3]='
priority[5][4]='$';
priority[5][5]='=';
}
void analyse()//对所输入的句子进行算符优先分析过程的函数
{
int i,j,f,z,z1,n,n1,z2,n2;
int count=0;//操作的步骤数
char a; //用于存放正在分析的字符
char p,Q,p1,p2;
f=strlen(input); //测出数组的长度
for(i=0;i<=f;i++)
{
a=input[i];
if(i==0)
remainString();
if(AnalyseStack[k]=='+'||AnalyseStack[k]=='*'||AnalyseStack[k]=='i'
||AnalyseStack[k]=='('||AnalyseStack[k]==')'||AnalyseStack[k]=='#')
j=k;
else
j=k-1;
z=testchar(AnalyseStack[j]);//从优先关系表中查出s[j]和a的优先关系
if(a=='+'||a=='*'||a=='i'||a=='('||a==')'||a=='#')
n=testchar(a);
else //如果句子含有不是终结符集合里的其它字符,不合法
{
printf("错误!该句子不是该文法的合法句子!\n");
break;
}
p=priority[z][n];
if(p=='$')
{
printf("错误!该句子不是该文法的合法句子!\n");
return;
}
if(p=='>')
{ for( ; ; )
{
Q=AnalyseStack[j];
if(AnalyseStack[j-1]=='+'||AnalyseStack[j-1]=='*'||AnalyseStack[j-1]=='i'
||AnalyseStack[j-1]=='('||AnalyseStack[j-1]==')'||AnalyseStack[j-1]=='#')
j=j-1;
else
j=j-2;
z1=testchar(AnalyseStack[j]);
n1=testchar(Q);
p1=priority[z1][n1];
if(p1=='
{
count++;
printf("(%d) %s\t%10c\t%5c%17s\t 归约\n",count,AnalyseStack,p,a,remain);
k=j+1;
i--;
AnalyseStack[k]='N';
int r,r1;
r=strlen(AnalyseStack);
for(r1=k+1;r1
AnalyseStack[r1]='\0';
break;
}
else
continue;
}
}
else
{
if(p=='
{
count++;
printf("(%d) %s\t%10c\t%5c%17s\t 移进\n",count,AnalyseStack,p,a,remain);
k=k+1;
AnalyseStack[k]=a;
remainString();
}
else
{
if(p=='=')
{
z2=testchar(AnalyseStack[j]);
n2=testchar('#');
p2=priority[z2][n2];
if(p2=='=')
{
count++;
printf("(%d) %s\t%10c\t%5c%17s\t 接受\n",count,AnalyseStack,p,a,remain);
printf("该句子是该文法的合法句子。\n");
break;
}
else
{
count++;
printf("(%d) %s\t%10c\t%5c%17s\t 移进\n",count,AnalyseStack,p,a,remain);
k=k+1;
AnalyseStack[k]=a;
remainString();
}
}
else
{
printf("错误!该句子不是该文法的合法句子!\n");
break;
}
}
}
}
}
int testchar(char x)
{
int m;
if(x=='+')
m=0;
if(x=='*')
m=1;
if(x=='i')
m=2;
if(x=='(')
m=3;
if(x==')')
m=4;
if(x=='#')
m=5;
return m;
}
void remainString()
{
int i,j;
i=strlen(remain);
for(j=0;j
remain[j]=remain[j+1];
remain[i-1]='\0';
}
int main()
{
init();
printf("请输入要进行分析的句子(以#号结束输入):\n");
gets(input);//将输入的字符串存到数组中
printf("步骤 栈 优先关系 当前符号 剩余输入串 移进或归约\n");
k=0;
AnalyseStack[k]='#';
AnalyseStack[k+1]='\0';
int length,i; //初始化剩余字符串数组为输入串
length=strlen(input);//
for(i=0;i
remain[i]=input[i];
remain[i]='\0';
analyse();//对所输入的句子进行算符优先分析过程的函数
return 0;
}
java编程实现算符优先分析法,编译原理实验三-算符优先分析法相关推荐
- 编译原理实验三 LR(1)分析法
实验三 LR(1)分析法 构造 LR(1)分析程序,利用它进行语法分析,判断给出的符号串是否为该文 法识别的句子,了解 LR(K)分析方法是严格的从左向右扫描,和自底向上的 语法分析方法. 二.实验内 ...
- 编译原理 实验三 LR(1)分析法 Java
1. 实验目的 构造 LR(1)分析程序,利用它进行语法分析,判断给出的符号串是否为该文法识别的句子,了解 LR(K)分析方法是严格的从左向右扫描,和自底向上的语法分析方法. 2. 实验内容 对下列文 ...
- 合工大 编译原理 实验三
合工大 编译原理 实验三 LR(1) 分析法 本项目使用c++实现,利用Windows API制作了简易的UI界面. 具体功能如下: 支持查看文法,项目族,LR(1) 分析表,句子归约过程. 可使用包 ...
- 编译原理实验三 语义分析程序设计与实现
一.实验目的 在实现词法.语法分析程序的基础上,编写相应的语义子程序,进行语义处理,加深对语法制导翻译原理的理解,进一步掌握将语法分析所识别的语法范畴变换为某种中间代码(四元式)的语义分析方法,并完成 ...
- 编译原理 实验四 LR(0)分析法(LR0分析表的自动生成)
写在前面 由于代码较长,csdn对文章总长度有字数限制,想只看完整代码的请移步另一篇博客. https://blog.csdn.net/qq_46640863/article/details/1257 ...
- 编译原理 实验二 LL(1)分析法程序实现
源代码仓库:CompilePrincipleLearning/experiment_2 · yusixian/CompilePrincipleLearning (github.com) 一. 实验目的 ...
- 编译原理实验三:对完整程序进行词法分析并输出对应的二元组
实验要求 [任务介绍]根据给定源语言的构词规则,从任意字符串中识别出该语言所有的合法的单词符号,并以等长的二元组形式输出. [输入]字符串形式的源程序. [输出]单词符号所构成的串(流),单词以等长的 ...
- 编译原理实验(算符优先文法)
work.h 1 #include<iostream> 2 #include<stdlib.h> 3 #include<stdio.h> 4 #includ ...
- 编译原理实验三【中间代码生成程序设计】
基本要求: ①掌握中间代码生成的基本方法. ②掌握语法制导翻译模式. ③完成算术表达式的中间代码生成程序. 重点及难点:掌握语法制导翻译模式的核心思想和工作原理,在此基础上完成基于算数表达式的中间代码 ...
最新文章
- Docker的安装和版本详细介绍
- php嵌套模板,thinkphp3.1自定义模板标签嵌套实现
- gin构建包含模板的二进制文件
- H5页面获取原生APP的登录状态
- c语言程序中cost的作用,C语言考试题基础版(21页)-原创力文档
- 【从零开始搭建自己的.NET Core Api框架】(二)搭建项目的整体架构
- linux ubuntu mysql 安装_1.MySQL的安装(linux Ubuntu环境下)
- 在linux上ansi格式转换换utf-8格式会乱码吗?,c++对编码格式ANSI utf8 unicode 进行转换...
- 第一章-操作系统概论
- Cesium:搭建运行环境
- 110道 MySQL面试题及答案 (持续更新)
- visio安装问题总结
- python画点位变化向量图
- 京瓷300i_kyocera cs 300i kx驱动下载
- 计算机技术作文500字初一,初一关于那一刻的作文500字(精选10篇)
- Q绑查询HTML源码
- php时间戳与date格式转换
- 读书笔记软件调试之道 :问题的核心-如何修复缺陷
- 百度:AI技术哪家强,度厂科大最在行?
- Android Crash 监控
热门文章
- 对比Excel,利用pandas进行数据分析各种用法
- eclipse 32位换成64位 maven tomcat svn 集成
- 虚拟机十步安装VMware_workstation
- 国外量化平台-quantopian体验
- 烤仔的朋友们丨政策暖风吹来,国内公链们的春天来了?
- Android获取手机屏幕密度
- 【open3d】安装open3d.whl之后,import报错ModuleNotFoundError: No module named ‘open3d.cpu‘
- IE文档模式的切换,Quirks模式
- mysql mybatis 不等于号写法
- 【烈日炎炎战后端】SpringMVC(0.5万字)