自定向下预测分析法(LL(1)非递归)
通过之前得学习,可以知道,使用自顶向下得预测分析法,选择产生式时没必要进行回溯,每一步推导仅有一个产生式符合要求,否则就出错。
怎么知道选哪个产生式呢?在进行推导之前,要有一个预测分析表,根据当前扫描到得终结符号和当前正在推导的非终结符,得到选用哪一条产生式。(是一个二维的表格)关于怎么生成预测分析表,前面的博客有提到过。
使用非递归的方法: - 当前正在推导的非终结符号在栈顶 - 通过查表,选择产生式 - 因为找到了产生式,所以需要用产生式的右部替换非终结符号,所以要将栈顶出栈 - 将产生式右部反着入栈(因为下一次还会从栈顶取出符号进行推导,首先推导的是产生式左端的符号,所以最左端的符号应该在栈顶,所以要反着入栈)伪代码
版本一:
//将结束符入栈
push('#');
//将开始符号入栈
push('E');
i = 0;//指向输入缓冲区的指针,初始情况下,指向第一个字符
//获取栈顶的元素
top = getTop();
while(top != '#'){
得到产生式M[top,s[i]]//M表示预测分析表
if(top是非终结符){
if(找到产生式){
pop();//将当前分析的非终结符出栈、
push(将产生式反着入栈);
top = getTop();
}
else{