我正在研究编译器设计,我正在尝试手工实现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的地方