Parser Stack Overflow LL(1)

时间:2018-04-24 00:40:52

标签: java parsing context-free-grammar ambiguous-grammar

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

0 个答案:

没有答案