编译原理实验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编程实现算符优先分析法,编译原理实验三-算符优先分析法相关推荐

  1. 编译原理实验三 LR(1)分析法

    实验三 LR(1)分析法 构造 LR(1)分析程序,利用它进行语法分析,判断给出的符号串是否为该文 法识别的句子,了解 LR(K)分析方法是严格的从左向右扫描,和自底向上的 语法分析方法. 二.实验内 ...

  2. 编译原理 实验三 LR(1)分析法 Java

    1. 实验目的 构造 LR(1)分析程序,利用它进行语法分析,判断给出的符号串是否为该文法识别的句子,了解 LR(K)分析方法是严格的从左向右扫描,和自底向上的语法分析方法. 2. 实验内容 对下列文 ...

  3. 合工大 编译原理 实验三

    合工大 编译原理 实验三 LR(1) 分析法 本项目使用c++实现,利用Windows API制作了简易的UI界面. 具体功能如下: 支持查看文法,项目族,LR(1) 分析表,句子归约过程. 可使用包 ...

  4. 编译原理实验三 语义分析程序设计与实现

    一.实验目的 在实现词法.语法分析程序的基础上,编写相应的语义子程序,进行语义处理,加深对语法制导翻译原理的理解,进一步掌握将语法分析所识别的语法范畴变换为某种中间代码(四元式)的语义分析方法,并完成 ...

  5. 编译原理 实验四 LR(0)分析法(LR0分析表的自动生成)

    写在前面 由于代码较长,csdn对文章总长度有字数限制,想只看完整代码的请移步另一篇博客. https://blog.csdn.net/qq_46640863/article/details/1257 ...

  6. 编译原理 实验二 LL(1)分析法程序实现

    源代码仓库:CompilePrincipleLearning/experiment_2 · yusixian/CompilePrincipleLearning (github.com) 一. 实验目的 ...

  7. 编译原理实验三:对完整程序进行词法分析并输出对应的二元组

    实验要求 [任务介绍]根据给定源语言的构词规则,从任意字符串中识别出该语言所有的合法的单词符号,并以等长的二元组形式输出. [输入]字符串形式的源程序. [输出]单词符号所构成的串(流),单词以等长的 ...

  8. 编译原理实验(算符优先文法)

    work.h  1 #include<iostream>  2 #include<stdlib.h>  3 #include<stdio.h>  4 #includ ...

  9. 编译原理实验三【中间代码生成程序设计】

    基本要求: ①掌握中间代码生成的基本方法. ②掌握语法制导翻译模式. ③完成算术表达式的中间代码生成程序. 重点及难点:掌握语法制导翻译模式的核心思想和工作原理,在此基础上完成基于算数表达式的中间代码 ...

最新文章

  1. Docker的安装和版本详细介绍
  2. php嵌套模板,thinkphp3.1自定义模板标签嵌套实现
  3. gin构建包含模板的二进制文件
  4. H5页面获取原生APP的登录状态
  5. c语言程序中cost的作用,C语言考试题基础版(21页)-原创力文档
  6. 【从零开始搭建自己的.NET Core Api框架】(二)搭建项目的整体架构
  7. linux ubuntu mysql 安装_1.MySQL的安装(linux Ubuntu环境下)
  8. 在linux上ansi格式转换换utf-8格式会乱码吗?,c++对编码格式ANSI utf8 unicode 进行转换...
  9. 第一章-操作系统概论
  10. Cesium:搭建运行环境
  11. 110道 MySQL面试题及答案 (持续更新)
  12. visio安装问题总结
  13. python画点位变化向量图
  14. 京瓷300i_kyocera cs 300i kx驱动下载
  15. 计算机技术作文500字初一,初一关于那一刻的作文500字(精选10篇)
  16. Q绑查询HTML源码
  17. php时间戳与date格式转换
  18. 读书笔记软件调试之道 :问题的核心-如何修复缺陷
  19. 百度:AI技术哪家强,度厂科大最在行?
  20. Android Crash 监控

热门文章

  1. 对比Excel,利用pandas进行数据分析各种用法
  2. eclipse 32位换成64位 maven tomcat svn 集成
  3. 虚拟机十步安装VMware_workstation
  4. 国外量化平台-quantopian体验
  5. 烤仔的朋友们丨政策暖风吹来,国内公链们的春天来了?
  6. Android获取手机屏幕密度
  7. 【open3d】安装open3d.whl之后,import报错ModuleNotFoundError: No module named ‘open3d.cpu‘
  8. IE文档模式的切换,Quirks模式
  9. mysql mybatis 不等于号写法
  10. 【烈日炎炎战后端】SpringMVC(0.5万字)