0

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

4

0 回答 0