1. LL(1)实现 自顶向下预测分析(方法二)
(1)消除文法左递归。
文法改写为:
E TE'
E' TE'| TE'| T FT'
T' *FT'|/FT'| F id|(E)|num
(2)画出状态图得
化简得
(3)FIRST集和FOLLOW集如下: FIRST(E)={id,(,num} FIRST(E’)={+,-,ε} FIRST(T)={id,(,num} FIRST(T’)={ *,/,ε} FIRST(F)={id,(,num}
(4)LL(1)分析表构造如图
:
FOLLOW(E)={},$} FOLLOW(E’)={},$} FOLLOW(T)={},+,-,$} FOLLOW(T’)={},+,-,$} FOLLOW(F)={},+,-,*,/,$}
(5)C++程序代码解析:
预置字符串类型预测分析表:
(””表示空白对应错误处理的跳过操作,”em”表示ε正常跳过,”s”表示synch对应错误处理的弹栈操作) string analyze_chart[6][10]={
"NULL", "+", "-", "*", "/", "id", "(", ")", "num", "$", "E", "", "", "", "", "TE'", "TE'", "s", "TE'", "s", "E'", "+TE'","-TE'","", "", "", "", "em", "", "em", "T", "s", "s", "", "", "FT'", "FT'", "s", "FT'", "s", "T'", "em", "em", "*FT'","/FT'","", "", "em", "", "em",
"F", "s", "s", "s", "s", "id", "(E)", "s", "num", "s" };
int searchl(string target)返回对应分析表中的行号 int searchr(char target)返回对应分析表中的列号
预测分析程序主体,输入参数target为待分析的记号流指针,用字符指针存储,length为字符串长度 void syntax_analyzing(const char * target,int length) 内部参数:
int ptr=0,line,row;其中ptr为记号流指针,line为预测分析表查找行号,row为预测分析表查找列号 string temp;此处temp为暂存变量,存储栈顶弹出的元素 stack<std::string> a_stack;字符串类型栈 (6)程序运行效果截图 正确记号流:
错误记号流: