LL(1)语法分析(java)
LL(1)语法分析(java)
转:http://blog.csdn.net/new_one_object/article/details/50670624
一、程序设计题目与说明
通过运用编译原理课程所学知识,实现LL(1)文法的语法分析程序,当任意输入一个文法符号串,通过程序中先设定好确定的LL(1)预测分析表,按照预测分析算法对输入串进行语法分析,判断其是否为符合文法规范的一个句子。如果符合文法规范则输出符号串、剩余输入串、规则等信息,否则输出错误信息
(自己加的,便于理解整个流程)简述:
init(),--》根节点E进栈,打印一行信息,不再用
totalControlProgram();,--》
1》第一步判断flag是true 则证明栈区有值,继续往下走,为false则栈区没有元素,退出
2》第二步判断栈顶元素是否是终结符,是终结符则直接pop出栈,缓冲区首字符也移除,打印输出信息
3》第三部判断栈顶元素是否为#有则匹配成功,flag设为false退出程序
4》第三步判断当前元素不为空,(如果到了这步,代表前面已经不是终结符#)把栈顶出栈,然后把得到的矩阵元素字符化后入栈
然后一步步往下走,遇见终结符就到《2》,遇到#就到《3》,遇到非终结符到《4》
二、全部代码
package downloadtest;
import java.util.Stack;
public class analyse {
// 加入同步符号的LL(1)分析表
private String[][] analysisTable = new String[][] { { "TZ", "", "", "TZ", "synch", "synch" },
{ "", "+TZ", "", "", "ε", "ε" }, { "FY", "synch", "", "FY", "synch", "synch" },
{ "", "ε", "*FY", "", "ε", "ε" }, { "i", "synch", "synch", "(E)", "synch", "synch" } };
// 存储终结符
private String[] VT = new String[] { "i", "+", "*", "(", ")", "#" };
// 存储非终结符
private String[] VN = new String[] { "E", "Z", "T", "Y", "F" };
// 输入串
private StringBuilder strToken;
// 分析栈
private Stack stack = new Stack();
// a保存从输入串中读取的一个输入符号,当前符号
private String a = null;
// X中保存stack栈顶符号
private String X = null;
// flag标志预测分析是否成功
private boolean flag = true;
// 记录输入串中当前字符的位置
private int cur = 0;
// 记录步数
private int count