我正在用一种简单的语言编写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()
}
答案 0 :(得分:0)
我真的不认为您可以考虑离开问题的方式。我怀疑(但尚未证明)从condition
生成的语言没有LL(1)语法。
无论如何,让我们尝试左分解。让我们研究一个更简单(但类似)的语法,其中包含问题的要点。终端为number
,=
,[
和]
。
C --> EXP = EXP | [ C ]
EXP --> number | [ EXP ]
现在,我不会做更多的事情,因为您应该自己做。我相当确定这是一个家庭作业问题,因此,如果我在这里这样做,我将剥夺您自己做教育的机会,更不用说乐趣了。
第一步是扩展EXP
中C
的第一个匹配项。确保在语法为LL(1)之前不要停止学习,否则请确保这是徒劳的。