我正在研究编译器设计,并且正在尝试手动实现 LL(1) 解析器。我已经完成了词法扫描器,它工作得很好。但是,我对消除左递归和左分解还是很陌生。我在 java 中创建了一个 parse() 方法,它正在输出一个 stackoverflow。我认为这是由于我的语法中某些东西的无限递归造成的。可能是什么原因造成的?这是我正在使用的语法:
start -> assign_var statement
assign_var -> DATATYPE VARIABLE ASSIGNMENT var assign_var | eps
var -> expression | STRING
expression -> factore'
e' -> PLUSMINUS factore' | eps
factor -> gf'
f' -> MULDIV gf' | eps
g -> VARIABLE | NUMBER | DECIMAL
statement -> STARTIF IF boolean_stmt THEN statement butif_stmt FINISHIF
statement -> STARTFROM FROM assign_var UNTIL boolean_stmt LOOP statement FINISHFROM
statement -> expression statement
statement -> WRITE g
statement -> READ g
statement -> eps
butif_stmt -> BUTIF boolean_stmt THEN statement | eps
boolean_stmt -> expression bln_optr expression
bln_optr -> EQUALITY | INEQUALITY | LESSTHANGREATERTHANEQUAL
其中大写字母单词是终端符号。谢谢!
这是一些java代码:
public static void assign_var(){
//assign_var -> DATATYPE VARIABLE ASSIGNMENT var assign_var | eps
if (lookahead.equals("DATATYPE")){
nextToken();
if(lookahead.equals("IDENTIFIER")){
nextToken();
if(lookahead.equals("ASSIGNMENT")){
nextToken();
var();
assign_var();
}
}
}
else {} //epsilon
}
else 语句是我计划实现 eps 的地方