实验二 语法分析程序设计与实现

  • 格式:docx
  • 大小:105.44 KB
  • 文档页数:7

下载文档原格式

  / 7
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验二语法分析程序设计与实现

一、实验目的

任选一种有代表性的语法分析方法,如算符优先法、递归下降法、LL(1)、SLR(1)、LR(1)等,通过设计、编制、调试实现一个典型的语法分析程序,对实验一所得扫描器提供的单词序列进行语法检查和结构分析,实现并进一步掌握常用的语法分析方法。

二、基本实验内容与要求

选择对各种常见高级程序设计语言都较为通用的语法结构——算术表达式的一个简化子集——作为分析对象,根据如下描述其语法结构的BNF定义G2[<算术表达式>],任选一种学过的语法分析方法,针对运算对象为无符号常数和变量的四则运算,设计并实现一个语法分析程序。

G2[<算术表达式>]:

<算术表达式> → <项> | <算术表达式>+<项> | <算术表达式>-<项>

<项> → <因式> | <项>*<因式> | <项>/<因式>

<因式> → <运算对象> | (<算术表达式>)

若将语法范畴<算术表达式>、<项>、<因式>和<运算对象>分别用E、T、F和i代表,则G2可写成:

G2[E]:E → T | E+T | E-T T → F | T*F | T/F F → i | (E)

输入:由实验一输出的单词串,例如:UCON,PL,UCON,MU,ID ······

输出:若输入源程序中的符号串是给定文法的句子,则输出“RIGHT”,并且给出每一步分析过程;若不是句子,即输入串有错误,则输出“ERROR”,并且显示分析至此所得的中间结果,如分析栈、符号栈中的信息等,以及必要的出错说明信息。

要求:

1、确定语法分析程序的流程图,同时考虑相应的数据结构,编写一个语法分析源程序。

2、将词法、语法分析合在一起构成一个完整的程序,并调试成功。

3、供测试的例子应包括符合语法规则的语句,及分析程序能判别的若干错例。对于所输入的字符串,不论对错,都应有明确的信息输出。

三、问题分析及源程序

LL1文法:

改写文法为:

E->TG e

G>+TG g

T->FS t

F->-TG g1

G->^ g2

S->*FS s

T->/FS s1

S->^ s2

F->(E) f

G->i f1

LL1

#include

#include

#include

#include

char A[30]; /*分析栈*/

char B[30]; /*剩余串*/

char v1[20]={'i','+','-','*','/','(',')','#'}; /*终结符*/ char v2[20]={'E','G','T','S','F'}; /*非终结符*/

int j=0,b=0,top=0,l; /*L为输入串长度*/ class type /*产生式类型定义*/ {public:

char origin; /*大写字符*/

char array[5]; /*产生式右边字符*/ int length; /*字符个数*/

};

type e,t,g,g1,g2,s,s1,s2,f,f1; /*类对象*/

type C[10][10]; /*预测分析表*/ void print() /*输出分析栈*/

{

int a;

for(a=0;a<=top+1;a++)

cout<

cout<<"\t\t";

}

void print1() /*输出剩余串*/

{

int j;

for(j=0;j

for(j=b;j<=l;j++)

cout<

cout<<"\t\t\t";

}

void main()

{

int m,n,k=0,flag=0,finish=0;

char ch,x;

type cha; /*用来接受C[m][n]*/ /*把文法产生式赋值结构体*/

e.origin='E';

strcpy(e.array,"TG");

e.length=2;

t.origin='T';

strcpy(t.array,"FS");

t.length=2;

g.origin='G';

strcpy(g.array,"+TG");

g.length=3;

g1.origin='G';

strcpy(g1.array,"-TG");

g1.length=3;

g2.origin='G';

g2.array[0]='^';

g2.length=1;

s.origin='S';

strcpy(s.array,"*FS");

s.length=3;

s1.origin='S';

strcpy(s1.array,"/FS");

s1.length=3;

s2.origin='S';

s2.array[0]='^';

s2.length=1;

f.origin='F';

strcpy(f.array,"(E)");

f.length=3;

f1.origin='F';

f1.array[0]='i';

f1.length=1;

for(m=0;m<=4;m++) /*初始化分析表*/ for(n=0;n<=7;n++)

C[m][n].origin='N'; /*全部赋为空*/

/*填充分析表*/

C[0][0]=e;C[0][5]=e;

C[1][1]=g;C[1][2]=g1;C[1][6]=g2;C[1][7]=g2;

C[2][0]=t;C[2][5]=t;