删除选择冲突而不进行前瞻-JavaCC
我试图在JavaCC中创建以下生产规则,但是我得到了一个选择冲突错误。我知道如何使用“向前看”修复它,但我的印象是,我们不允许在任务中使用它删除选择冲突而不进行前瞻-JavaCC,java,regex,compiler-construction,javacc,Java,Regex,Compiler Construction,Javacc,我试图在JavaCC中创建以下生产规则,但是我得到了一个选择冲突错误。我知道如何使用“向前看”修复它,但我的印象是,我们不允许在任务中使用它 void statement() #void:{} { <ID> (<ASSIGN>(expression() | <STRING> ))| <LEFTBRACKET>argument_list()<RIGHTBRACKET> | <NOT>expression() | <Q
void statement() #void:{}
{
<ID> (<ASSIGN>(expression() | <STRING> ))| <LEFTBRACKET>argument_list()<RIGHTBRACKET>
| <NOT>expression()
| <QUESTIONMARK><ID>
| <LEFTBRACE>(statement()<SEMICOLON>)*<RIGHTBRACE>
| <IF>condition()<THEN>statement() <-- Conflict, parser will always pick this one
| <IF>condition()<THEN>statement()<ELSE>statement() <--
| <WHILE>condition()<DO>statement()
| {}
}
void语句()#void:{}
{
((表达式()|)|参数列表()
|表达式()
|
|(语句())*
|condition()statement()这是来自的经典“悬空else”问题。您应该将两个if
产品替换为具有可选else
的单个if
产品;您还应该在else
前面添加LOOKAHEAD(1)
,如下所示:
| <IF>condition()<THEN>statement()
| <IF>condition()<THEN>statement()<ELSE>statement()
|条件()语句()
|条件()语句()语句()
变成
| <IF>condition()<THEN>statement() [LOOKAHEAD(1) <ELSE>statement()]
|条件()语句()
嘿,谢谢你的回复。我确实有这个解决方案,但我不确定我们是否可以使用lookaheads。如果我使用这个,解析器还会是LL(1)吗?另外,如果这个问题没有其他解决方案,那么我假设这是正确的答案!谢谢again@Tomcelic我认为添加LOOKAHEAD(1)
使其成为LL(2)
,但我不是100%确定。语法仍然不明确,除非你添加
,但是解析器会接受它,并将else
与最里面的if
配对。你认为这样行吗?/*if语句*/void if_语句():{}{{{condition()语句()(语句(){}}没有LL(1)经典if-else问题的语法。例如,没有LL(1)语法等价于S'->S$;S->o;S->i S;S->i S E S。