Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.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
If statement „;不稳定“;通过JavaCC对IFCC语句进行语法分析?_If Statement_Grammar_Javacc - Fatal编程技术网

If statement „;不稳定“;通过JavaCC对IFCC语句进行语法分析?

If statement „;不稳定“;通过JavaCC对IFCC语句进行语法分析?,if-statement,grammar,javacc,If Statement,Grammar,Javacc,从Java1.1语法开始,我尝试为一种新语言编写简化的语法。尝试解析各种形状的IfStatements时,我遇到了一个奇怪的问题,我不理解,也找不到解决方案。 我编写了两个测试程序,第一个包含: … if (a > b) { x = 15; } else { x = 30; } 第二点: … if (a > b) x = 15; else x = 30; 第一个程序的解析没有任何问题,而第二个程序的解析器停止时会显示消息“在(else的开头)遇到else,预期为:bo

从Java1.1语法开始,我尝试为一种新语言编写简化的语法。尝试解析各种形状的IfStatements时,我遇到了一个奇怪的问题,我不理解,也找不到解决方案。 我编写了两个测试程序,第一个包含:

…  if (a > b) { x = 15; } else { x = 30; } 
第二点:

…  if (a > b) x = 15; else  x = 30;  
第一个程序的解析没有任何问题,而第二个程序的解析器停止时会显示消息“在(else的开头)遇到else,预期为:boolean | break | byte | char | continue…”。根据语法(或者更确切地说,根据我的意图)一个语句块或一个语句之间不应该有任何区别,令我惊讶的是,这个语句在WHILE或DO但not for IF中都能完美地工作

我的相关语法如下:

void Statement() :
{}
{
  ( LOOKAHEAD(2)
  Block()  |  EmptyStatement()  |  IfStatement()  |
  WhileStatement()  |  ...
}

void Block() :
{}
{  "{"   (   BlockStatement()   )*   "}"
}

void BlockStatement() :
{}
{
  ( LOOKAHEAD(2)  LocalVariableDeclaration() ";"  |
  Statement()
  )
}

void EmptyStatement() :
{}
{  ";"  }

void IfStatement() :
{}
{
  "if" "(" Expression() ")"   Statement()   
[ LOOKAHEAD(1) "else" Statement() ]
}

void WhileStatement() :
{}
{
  "while" "(" Expression() ")" Statement()
}
第二个观察结果可能与上述问题有关:如前所述,第一个测试程序被正确解析。但是,对于IF语句中(部分)语法规则中的“Statement”,解析器生成了一个过于复杂的“Statement,Block,BlockStatement,Statement”序列当解析包含等效while循环的测试程序时,在语句内容前后包含EmptyStatement的节点只生成“statement”,而根本不生成EmptyStatements

到目前为止,我已经尝试增加IfStatement和/或语句产品中的lookahead元素的数量,但没有任何效果


这里出了什么问题,或者我的语法出了什么问题?

使用DEBUG\u PARSER=true选项,发布一个示例输入和与该输入对应的完整输出。为什么您不认为显示赋值语句(或表达式语句,或任何
x=15;
应该匹配的语句)是相关的呢?很难说不看就确定,但我敢打赌,问题是这些语句的规则忽略了
@rici:非常感谢你的提示:这才是真正的解决方案。我根本没想到会在那个角落发现错误!顺便说一句,我建议去掉所有的前瞻性规范,然后只放回去那些你真正需要的,我怀疑你唯一需要的是“其他”之前的那一个。谢谢你的评论。我已经找到了错误的原因,但我还没有彻底测试它。在圣诞节、新年等日子之后,我被一些“管理人员”抓住了。。。