Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
删除选择冲突而不进行前瞻-JavaCC_Java_Regex_Compiler Construction_Javacc - Fatal编程技术网

删除选择冲突而不进行前瞻-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

我试图在JavaCC中创建以下生产规则,但是我得到了一个选择冲突错误。我知道如何使用“向前看”修复它,但我的印象是,我们不允许在任务中使用它

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。