语法分析C语言程序

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

实验内容:

可选择LL1分析法、算符优先分析法、LR分析法之一,实现如下表达式文法的语法分析器:

(1)E→E+T | E-T | T

(2)T→T*F | T/F | F

(3)F→P^F | P

(4)P→(E) | i

实验环境:

Windows XP

实验分析:

(1)定义部分:定义常量、变量、数据结构。

(2)初始化:设立LL(1)分析表、初始化变量空间(包括堆栈、结构体、数组、临时变量等);

(3)控制部分:从键盘输入一个表达式符号串;

(4)利用LL(1)分析算法进行表达式处理:根据LL(1)分析表对表达式符号串进行堆栈(或其他)操作,输出分

实验程序:

#include

#include

using namespace std;

stack symbol;

stack state;

char sen[50];

char sym[12][6]={//符号表

{'s','e','e','s','e','e'},

{'e','s','e','e','e','a'},

{'r','r','s','r','r','r'},

{'r','r','r','r','r','r'},

{'s','e','e','s','e','e'},

{'r','r','r','r','r','r'},

{'s','e','e','s','e','e'},

{'s','e','e','s','e','e'},

{'r','r','s','r','r','r'},

{'r','r','r','r','r','r'},

{'r','r','r','r','r','r'}

};

char snum[12][6]={//数字表

{5,1,1,4,2,1},

{3,6,5,3,2,0},

{2,2,7,2,2,2},

{4,4,4,4,4,4},

{5,1,1,4,2,1},

{6,6,6,6,6,6},

{5,1,1,4,2,1},

{5,1,1,4,2,1},

{3,6,5,3,11,4},

{1,1,7,1,1,1},

{3,3,3,3,3,3},

{5,5,5,5,5,5}

};

int go2[12][3]={//goto表

{1,2,3},

{0,0,0},

{0,0,0},

{0,0,0},

{8,2,3},

{0,0,0},

{0,9,3},

{0,0,10},

{0,0,0},

{0,0,0},

{0,0,0},

{0,0,0}

};

void action(int i,char *&a,char &how,int &num,char &A,int &b)//action函数[i,a] {

int j;

switch(*a)

{

case 'i':

j=0;break;

case '+':

j=1;break;

case '*':

j=2;break;

case '(':

case ')':

j=4;break;

case '#':

j=5;break;

default:

j=-1;break;

}

if(j!=-1)

{

how=sym[i][j];

num=snum[i][j];

if(how=='r')

{

switch(num)

{

case 1:

A='E',b=3;

cout<<"按E->E+T规约"<

case 2:

A='E',b=1;

cout<<"按E->T规约"<

case 3:

A='T',b=3;

cout<<"按T->T*F规约"<

case 4:

A='T',b=1;

cout<<"按T->F规约"<

case 5:

A='F',b=3;

cout<<"按F->(E)规约"<

case 6:

A='F',b=1;

cout<<"按F->id规约"<

default:

break;

}

}

}

int go(int t,char A)//goto[t,A]

{

switch(A)

{

case 'E':

return go2[t][0];break;

case 'T':

return go2[t][1];break;

case 'F':

return go2[t][2];break;

}

}

void error(int i,int j,char *&a)//error处理函数

{

cout<<"error"<

switch(j)

{

case 1://期望输入id或左括号,但是碰到+,*,或$,就假设已经输入id了,转到状态5 state.push(5);

symbol.push('i');//必须有这个,如果假设输入id的话,符号栈里必须有....

cout<<"缺少运算对象id"<

break;

case 2://从输入中删除右括号

a++;

cout<<"不配对的右括号"<

break;

case 3://期望碰到+,但是输入id或左括号,假设已经输入算符+,转到状态6

state.push(6);

symbol.push('+');

cout<<"缺少运算符"<

break;

case 4://缺少右括号,假设已经输入右括号,转到状态11

state.push(11);

symbol.push(')');

cout<<"缺少右括号"<

break;

case 5:

a++;

cout<<"*号无效,应该输入+号!"<

case 6:

a++;

}

}

相关文档
最新文档