语法分析C语言程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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
stack
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++; } }