实验3语义分析.docVIP

  • 9
  • 0
  • 约4.72千字
  • 约 6页
  • 2018-03-16 发布于河南
  • 举报
实验3语义分析

实验三 语义分析 实验目的:掌握算符优先文法及语义分析过程 实验内容:使用算符优先文法及语义分析方法实现以下文法对输入符号串的判别及运算 L-E E-E+T E-T T-T*F T-F F-(E) F-digit 实验要求: 算符优先级表可以手工计算,在程序中直接给出; 可以不做词法分析(假定已经完成); 算式中的digit为0,1,2,。。。,9; 如果符号串不符合语法要给 出错提示,指出哪里出错; 在屏幕上输出运算过程及结果; 只需一位十进制数的运算 /*扩展文法 (1) S--#L# (2) L--E (3) E--E+L (4) E--T (5) T--T*F (6) T--F (7) F--(E) (8) F--digit 非终结符的FIRSTVT集 LASTVT集: FIRSTVT(S)={#} LASTVT(S)={#} FIRSTVT(L)={+,*,(,digit} LASTVT(L)={+,*,),digit} FIRSTVT(E)={+,*,(,digit} LASTVT(E)={+,*,),digit} FIRSTVT(T)={*,(,digit} LASTVT(T)={*,),digit} FIRSTVT(F)={(,digit} LASTVT(F)={).digit} 算符优先分析表//@表示无优先关系 # + * ( ) digit # = @ + * ( @ = ) @ @ digit @ @ */ 编码: #include iostream #include stdio.h #include stack #include string.h #define max 201 using namespace std; int f[max];//符号映射表 int val[max]; char* tables[max];//优先级表 int sp;//符号栈顶指针 char src[max]; struct Node { char w;//字符 int v;//值 }SS[max];//符号栈 char get_a() {//取离开栈顶最近的终结符 int pos = sp; while (pos != -1) { if (SS[pos].w = A SS[pos].w = Z) pos--; else return SS[pos].w; } printf(ERROE!\n); return @; } void Init() {//初始化 memset(f, -1, sizeof(f)); memset(val, -1, sizeof(val)); tables[0] = =@; tables[1] = ; tables[2] = ; tables[3] = @=; tables[4] = @@; tables[5] = @@; f[35] = 0;//# f[43] = 1;//+ f[42] = 2;//* f[40] = 3;//( f[41] = 4;//) for (int i = 48; i = 57; i++) f[i] = 5;//0~9(digit) } void check(Node *a, int len) {//判定归约 Node c; int ans; if (len == 1 a[0].w = 0 a[0].w = 9) { c.w = F; c.v = a[0].w - 0; SS[++sp] = c; return; } if (len == 3 a[0].w == )) { c.w = F; c.v = a[1].v; SS[++sp] = c; return; } if (len == 1 a[0].w == F) { c.w = T; c.v = a[0].v; SS[++sp] = c; return; } if (len == 3 a[1].w == *) { ans = a[0].v * a[2].v; printf(%d*%d=%d\n, a[2].v, a[0].v, ans); c.w = T; c.v = ans; SS[++sp] = c; return; } if (len =

文档评论(0)

1亿VIP精品文档

相关文档