If statement „;不稳定“;通过JavaCC对IFCC语句进行语法分析?
从Java1.1语法开始,我尝试为一种新语言编写简化的语法。尝试解析各种形状的IfStatements时,我遇到了一个奇怪的问题,我不理解,也找不到解决方案。 我编写了两个测试程序,第一个包含: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
… 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:非常感谢你的提示:这才是真正的解决方案。我根本没想到会在那个角落发现错误!顺便说一句,我建议去掉所有的前瞻性规范,然后只放回去那些你真正需要的,我怀疑你唯一需要的是“其他”之前的那一个。谢谢你的评论。我已经找到了错误的原因,但我还没有彻底测试它。在圣诞节、新年等日子之后,我被一些“管理人员”抓住了。。。