Javacc-通过使用左因子代替前瞻来消除选择冲突

时间:2018-11-11 18:44:32

标签: regex parsing compiler-construction stringtokenizer javacc

我正在用一种简单的语言编写JAVACC程序,我遇到了1个可以通过使用LOOKAHEAD(2)修复的冲突。我可以通过左分解代码而不是使用外观来克服此问题-提前,如果没有,为什么?

语法

void expression() : {}
{
    simple_expression() (addition_or_substraction() | {})
}

void simple_expression() : {}
{
    <NUMBER>
    | <LBRAC> expression() <RBRAC> 
}

void condition() : {}
{
     simple_condition() (compare_condition() | {})
} 

void prime_condition() : {}
{
    expression_comparison()
    |<NOT_OPERATOR> condition()
    | LOOKAHEAD(2) <LBRAC> condition() <RBRAC> // Choice conflict for "("
}

void expression_comparison() : {}
{
    expression()
    (   
         <EQUAL> expression()
         <LESS_THAN> expression()
         <GREATER_THAN> expression()
    )
}

void compare_condition() : {}
{
    <AND> condition() | <OR> condition()
}

1 个答案:

答案 0 :(得分:0)

我真的不认为您可以考虑离开问题的方式。我怀疑(但尚未证明)从condition生成的语言没有LL(1)语法。

无论如何,让我们尝试左分解。让我们研究一个更简单(但类似)的语法,其中包含问题的要点。终端为number=[]

C --> EXP = EXP  | [ C ]
EXP --> number | [ EXP ]

现在,我不会做更多的事情,因为您应该自己做。我相当确定这是一个家庭作业问题,因此,如果我在这里这样做,我将剥夺您自己做教育的机会,更不用说乐趣了。

第一步是扩展EXPC的第一个匹配项。确保在语法为LL(1)之前不要停止学习,否则请确保这是徒劳的。