代码是从清华那本编译教材后边实验部分改的
二、实验内容
“简单的算法表达式文法”
〈算术表达式〉∷=〈项〉│〈算术表达式〉+〈项〉│〈算术表达式〉-〈项〉
〈项〉∷=〈因式〉│〈项〉*〈因式〉│〈项〉/〈因式〉
〈因式〉∷=〈变量〉│(〈算术表达式〉)
〈变量〉∷=a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z
说明:为了简化变量,即简化词法分析程序,此文法中变量的定义就是一个字母。
根据“简单的算法表达式文法”在starter files基础上编写一个递归向下的语法分析程序。
输入:字符串或者文本文件
输出:“合法表达式”或者“非法表达式”
例如:输入a+b*c-b/d则显示或者输出“合法表达式”,输入aa++–c*则显示或者输出“非法表达式”
三、实验分析与设计
S: 算术表达式
B: 项
C: 因式
D: 变量
消除左递归后的文法:
S->BI
I->+BI|-BI|ξ
B->CJ
J->*BI|/BI|ξ
C->D|(S)
D->a|…|z
First(S)={a,…,z,(}
First(I)={+,-, ξ}
First(B)={a,…,z,(}
First(J)={*,/, ξ}
First(C)={a,…,z,(}
First(D)={a,…,z}
Follow(S)={#,)}
Follow(B)={+,-,),#}
Follow(I)={#,)}
Follow(J)={+,-,),#}
Follow(C)={*,/,+,-,),#}
Follow(D)={*,/,+,-,),#}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
/* 符号 */
enum symbol //枚举类型
{
nul, end, ident, plus, times, lparen, divide, rparen, sub,
};
#define al 10 //标识符的最大长度
enum symbol sym; //当前的符号
char ch; //获取当前字符,getch 使用
char a[al+1]; //当前标识符ident
FILE* fin; //用于指向输入文件的指针
void getsym();