【实验目的】

练习构造语法分析程序的方法,熟悉上下文无关文法的使用,加深对课堂教学的理解;提高词法分析方法的实践能力

【实验要求】

利用某一高级程序设计语言构造语法分析程序

【具体要求】对于给定的文法G[E]

              E->TE’

             E’->+TE’ | ε

            T->FT’

            T’->*F T’| ε

            F->(E) | i

采用递归下降分析法编写语法分析程序及LL(1)语法分析法编写语法分析程序,该语法分析程序判断输入的字符串是否符合上述文法,并能够输出相应的结果(是语法成分或不是语法成分)。

/* 实验名称:实验2 语法分析器实验 学号: 姓名:niu91(859222829) 班级:
*/
#include<stdio.h>
#include<string.h>
#include<malloc.h>
#define N 100int seekProd(int stackTop,int inputstrTop);
//char inputstr[10]="i*i+i#";
char inputstr[20];
char stack[10]="";typedef struct production{char leftChar;char rightChars[4];char allChars[8];
}Prod;Prod productions[8];
void init();
int stackPush(int *top, Prod prod);
int matching(int *top, char *inputstr);
int main()
{int len;//输入串的长度int stackTop=1;int inputstrTop=0;int i;char *z="#";int index=0;init();//产生式初始化stack[0]='#';stack[stackTop]='E';printf("请输入字符串:");gets(inputstr);len=strlen(inputstr);inputstr[len]='#';while( stackTop>=0 ){//    printf("%d,%d\n",stackTop,inputstrTop);printf("第%2d步:",++index);printf("当前栈:%-8s",stack);printf("输入字符串:%8s",inputstr);//根据栈定元素和字符串首字母if(matching(&stackTop,inputstr)){printf("\n");}else{i=seekProd(stackTop,inputstrTop);stackPush(&stackTop,productions[i]);//压栈printf("进行下一步所用的产生式:%s\n",productions[i].allChars);}       }if(stackTop+1==0){printf("分析成功!\n");}return 0;
}//搜索分析表
int seekProd(int stackTop,int inputstrTop)
{
//  printf("stack[stackTop]=%c\n",stack[stackTop]);if(stack[stackTop]=='E'){if(inputstr[inputstrTop]=='i'){return 0;}else if(inputstr[inputstrTop]=='('){return 0;}else{return -1;}}else if(stack[stackTop]=='X'){if(inputstr[inputstrTop]=='+'){return 1;}else if(inputstr[inputstrTop]==')'){return 2;}else if(inputstr[inputstrTop]=='#'){return 2;}else{return -1;}}else if(stack[stackTop]=='T'){if(inputstr[inputstrTop]=='i'){return 3;}else if(inputstr[inputstrTop]=='('){return 3;}else{return -1;}}else if(stack[stackTop]=='Y'){if(inputstr[inputstrTop]=='+'){return 5;}else if(inputstr[inputstrTop]=='*'){return 4;}else if(inputstr[inputstrTop]==')'){return 5;}else if(inputstr[inputstrTop]=='#'){return 5;}else{return -1;}}else if(stack[stackTop]=='F'){if(inputstr[inputstrTop]=='i'){return 7;}else if(inputstr[inputstrTop]=='('){return 6;}else{return -1;}}else{printf("错误!");}return -1;
}
void init()
{productions[0].leftChar='E';strcpy(productions[0].rightChars,"TX");   strcpy(productions[0].allChars,"E->TX");productions[1].leftChar='X';strcpy(productions[1].rightChars,"+TX");strcpy(productions[1].allChars,"E->+TX");productions[2].leftChar='X';strcpy(productions[2].rightChars,"ε");   strcpy(productions[2].allChars,"X->ε");productions[3].leftChar='T';strcpy(productions[3].rightChars,"FY");    strcpy(productions[3].allChars,"T->FY");productions[4].leftChar='Y';strcpy(productions[4].rightChars,"*FY");strcpy(productions[4].allChars,"Y->*FY");productions[5].leftChar='Y';strcpy(productions[5].rightChars,"ε"); strcpy(productions[5].allChars,"Y->ε");productions[6].leftChar='F';strcpy(productions[6].rightChars,"(E)");strcpy(productions[6].allChars,"F->(E)");productions[7].leftChar='F';strcpy(productions[7].rightChars,"i");  strcpy(productions[7].allChars,"F->i");
}
int stackPush(int *top, Prod prod)
{int len;int i;char *c="ε";len=strlen(prod.rightChars);if(!strcmp(prod.rightChars,c)){stack[(*top)]='\0';}else{for(i=len-1;i>=0;i--){stack[(*top)++] = prod.rightChars[i];}}--(*top);return 0;
}
int matching(int *top, char *inputstr)
{int len;int i;if(stack[(*top)]==inputstr[0]){    stack[(*top)--]='\0';len=strlen(inputstr);for(i=0;i<len-1;i++){inputstr[i]=inputstr[i+1];}inputstr[i]='\0';return 1;}else{return 0;}
}

编译原理 实验2 语法分析器的构造相关推荐

  1. 编译原理实验-LL1语法分析器(自动生成First集、Follow集求法)java实现

    编译原理实验-LL1语法分析器(自动生成First.Follow)java 博主在做实验时,参考众多他人代码,发现bug众多,在@moni_mm代码基础上,与伙伴把能看到的BUG都做出修正,同时增添了 ...

  2. 贵州大学-编译原理实验2-句法分析器

    贵州大学-编译原理实验2-句法分析器 考虑下面的C语言子集的文法,其中<>括起来的为非终结符,粗体为终结符. ® <statement_list> <statement_ ...

  3. 【编译原理】LR语法分析器的设计与实现

    LR语法分析器的设计与实现 本文为当时编译原理实验作业,要求用设计的思想完成,小题大做,仅供参考 文章目录 LR语法分析器的设计与实现 实验要求 实现功能 输入输出 样例 一.LR语法分析器问题定义 ...

  4. 编译原理 LL(1)语法分析器的设计与实现

    实验内容 针对SysY语言中简单算术表达式文法G[E]: E→TE' E'→ATE'|ε T→FT' T'→MFT' |ε F→(E) | i A → + | - M → * | / 求解相应的FIR ...

  5. 【编译原理】词法分析器语法分析器

    简单编译器设计 采用Java语言对C++语言进行编译,具体的简单编译器设计 词法分析器-扫描器的设计与实现 基本符号表 状态转换图 代码实现 import java.io.*; import java ...

  6. 编译原理之简单语法分析器(c语言)

    语法分析是编译过程的核心部分,其基本任务是根据语言的语法规则进行语法分析,如果不存在语法错误即给出正确的语法结果,并为语义分析和代码生成做准备. 语法分析器的两种方式 语法分析器的任务主要是确定是否可 ...

  7. 编译原理-5-LL(1)语法分析器

    LL(1)语法分析器 1. 什么是LL(1)语法分析器 自顶向下的.递归下降的.预测分析的.适用于LL(1)文法的LL(1)语法分析器 自顶向下构建语法分析树 根节点是文法的起始符号SSS 每个中间节 ...

  8. 编译原理LR(1)语法分析器 C++实现

    LR(1)语法分析器 C++语言编写,已通过VS2019调试 文章目录 LR(1)语法分析器 一.测试结果 二.测试文件 三.核心代码 四.完整代码 感谢阅读! 如有错误,恳请指正! 一.测试结果 二 ...

  9. 编译原理:抽象语法树的构造例题

    1) 2) 3)

最新文章

  1. leangoo新增自定义模板、移动卡片、复制泳道功能
  2. python 测试用例怎么输入两个_python selenium多个测试用例
  3. django1.11.6+nginx1.12.2+uwsgi2.0.15 部署
  4. npm ERR! code ELIFECYCLE npm ERR! errno 1 npm ERR! iview-admin@2.0.0 dev: `vue-cli-service serve
  5. 使用idea编写SparkStreaming消费kafka中的数据【小案例】(四)
  6. 新世纪英汉词典 | 今日最佳
  7. linux的ftp指令发邮件,三种使用Linux命令发送邮件
  8. ORACLE EBS FORM 二次开发常用小技巧
  9. SqlServer发布订阅错误收集
  10. 在Visio里加上、下标方法
  11. VOS3000 8.05安装及源码
  12. android logo颜色渐变,2018,很多APP的logo渐变了 -- 渐变色教程
  13. 豆瓣fm android,豆瓣 FM
  14. pb 修改数据窗口种指定字段位置_PB数据窗口对象之字段操作
  15. mssql用户/角色无法查询sys.dm_tran_locks视图;消息 297,级别 16,状态 1,第 1 行 用户没有执行此操作的权限。
  16. GitLab CI/CD 基础教程(一)
  17. python详细安装教程-Pycharm及python安装详细教程(图解)
  18. 1003 Emergency (25 point(s))
  19. Java配置环境变量(Windows)
  20. Linux命令教程第二期

热门文章

  1. 【你好,windows】嵌入式win8.1 X86X64企业纯净版安装版2019.6.20
  2. 侍魂胧月传说怎么在电脑上玩 侍魂胧月传说电脑版玩法攻略
  3. Box2D 源码编译
  4. sqlserver 模糊查询
  5. # Linkage Mapper 版本及下载
  6. FCFS,SJF以及PSA进程调度算法效率的比较
  7. 计算机程序创始人阿达洛芙莱斯
  8. 华为“达芬奇计划”首次曝光!
  9. 13年android手机top,2013年1月安卓热门机型Top20
  10. 单片机流星灯_51单片机流星灯c语言源程序