当前位置:文档之家› 语法分析程序实验报告及代码

语法分析程序实验报告及代码

LL(1)语法分析实验报告一、实验题目 LL(1)语法分析二、实验目的通过设计、编制、调试一个典型的语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查和结构分析,检查语法错误,进一步掌握常用的语法分析方法。

三、实验内容构造LL(1)语法分析程序,任意输入一个文法符号串,并判断它是否为文法的一个句子。

程序要求为该文法构造预测分析表,并按照预测分析算法对输入串进行语法分析,判别程序是否符合已知的语法规则,如果不符合则输出错误信息。

消除递归前的文法消除递归和提取公因子后的等价文法S →S ∨ a T | a T | ∨ a T S→aTS’ |vaTS’T →∧ a T | ∧a S’→vaTS’ |εT→∧ a T’T’→∧ aT’|ε根据已建立的分析表,对下列输入串:a∧ a∧ a进行语法分析,判断其是否符合文法。

四、实验要求1.根据已由的文法规则建立LL(1)分析表;2.输出分析过程。

请输入待分析的字符串: a∧ a∧ a符号栈输入串所用产生式#S a∧ a∧ a##S’Ta a∧ a∧ a# S→aTS’#S’T ∧ a∧ a## S’T’a∧∧ a∧ a# T→∧ a T’# S’T’a a∧ a## S’T’∧ a## S’T’a∧∧ a# T’→∧ aT’# S’ T’a a## S’ T’## S’ # T’→ε# # S’→ε五、程序思路模块结构:1、定义部分:定义常量、变量、数据结构。

2、初始化:设立LL(1)分析表、初始化变量空间(包括堆栈、结构体等);3、运行程序:让程序分析一个text文件,判断输入的字符串是否符合文法定义的规则;4、利用LL(1)分析算法进行表达式处理:根据LL(1)分析表对表达式符号串进行堆栈(或其他)操作,输出分析结果,如果遇到错误则显示简单的错误提示。

六、程序源代码/* 程序名称: LL(1)文法分析程序 *//* S->S>aT|aT|>aT *//* T-> <aT|<a*//************************************//********************************************/ /* 程序相关说明 *//* A=S’ B=T’ *//* 0=S 1=S’ 2=T 3=T’*//* 0=a 1=< 2=#*//************************************/#include"iostream.h"#include "stdio.h"#include "malloc.h"#include "conio.h"struct Lchar{char char_ch;struct Lchar *next;}Lchar,*p,*h,*temp,*top,*base;char curchar;char curtocmp;int right;int table[4][3]={{1,0,0},{0,0,1},{0,1,0},{0,1,1}};int i,j;void push(char pchar)temp=(struct Lchar*)malloc(sizeof(Lchar));temp->char_ch=pchar;temp->next=top;top=temp;}void pop(void){curtocmp=top->char_ch;if(top->char_ch!='#')top=top->next;}void doforpush(int t){switch(t){case 3:push('A');push('T');push('a');push('<');break; case 0:push('A');push('T');push('a');break;case 6:push('T');push('a');push('<');break;case 21:push('B');push('a');push('<');break;case 31:push('T');break;}}void changchartoint()switch(curtocmp){case 'S':i=0;break;case 'A':i=1;break;case 'T':i=2;break;case 'B':i=3;break;}switch(curchar){case 'a':j=0;break;case '<':j=1;break;case '#':j=2;}}void dosome(void){int t;for(;;){pop();curchar=h->char_ch;printf("\n%c\t%c",curchar,curtocmp); if(curtocmp=='#' && curchar=='#')if(curtocmp=='S'||curtocmp=='A'||curtocmp=='T'||curtocmp=='B') {if(curtocmp!='#'){changchartoint();if(table[i][j]){t=10*i+j;doforpush(t);continue;}else{right=0;break;}}elseif(curtocmp!=curchar){right=0;break;}break;}elseif(curtocmp!=curchar){right=0;break;}else{h=h->next;continue;}}}void main(void){char ch;cout<<"* 文件名称: 语法分析"<<endl; cout<<" "<<endl;cout<<"/* 程序相关说明 */"<<endl;cout<<"---------------------------------------------------------------------"<<endl;cout<<"-/* A=S’ B=T’ */"<<endl;cout<<"-* 目的: 对输入LL(1)文法字符串,本程序能自动判断所给字符串是 -"<<endl;cout<<"-* 否为所给文法的句子,并能给出分析过程。

-"<<endl;cout<<"-*-------------------------------------------------------------------"<<endl;cout<<" 表达式文法为:"<<endl;cout<<" S->S>aT|aT|>aT "<<endl;cout<<" T-> <aT|<a "<<endl;cout<<"请在下行输入要分析的串(#号结束):"<<endl;right=1;base=(struct Lchar*)malloc(sizeof(Lchar));base->next=NULL;base->char_ch='#';temp=(struct Lchar*)malloc(sizeof(Lchar));temp->next=base;temp->char_ch='S';top=temp;h=(struct Lchar*)malloc(sizeof(Lchar));h->next=NULL;p=h;do{ch=getch();putch(ch);if(ch=='a'||ch=='<'||ch=='#'){temp=(struct Lchar*)malloc(sizeof(Lchar)); temp->next=NULL;temp->char_ch=ch;h->next=temp;h=h->next;}else{temp=p->next;printf("\nInput a wrong char!Input again:\n"); for(;;){if (temp!=NULL)printf("%c",temp->char_ch);elsebreak;temp=temp->next;}}while(ch!='#');p=p->next;h=p;dosome();if(right)printf("\n成功!\n");elseprintf("\n错误!\n");getch();}七、程序调试与测试结果(输出结果截屏)特别注明:程序中使用“<”代替“ ”。

输入a<a<a# 后显示结果如图:若输入aa# 则显示错误信息如图:注意:所有的输入串都要以#结束。

八:实验总结:实验前首先要明白实验的目的,了解什么是LL(1)语法,实验前首先要写出分析表,然后写出实验输出的分析过程,然后再写代码,分析实验结果。

相关主题