我正在为学校开发一个项目,将 BNF 形式的 Decaf 规范转换为上下文无关语法并在 ANTLR 中构建它。我已经为此工作了几个星期,当我陷入困境时,我一直在去找教授,但我终于遇到了他说不应该导致错误的东西。这是我语法的孤立部分, expr 是起点。在我这样做之前,我有一个问题。
如果我的词法分析器规则出现在我的语法中的解析器规则之前,或者它们是否通过我的语法文件间歇性地混合在一起,这是否重要?
calloutarg: expr | STRING;
expr: multexpr ((PLUS|MINUS) multexpr)* ;
multexpr : atom ((MULT|DIVISION) atom)*
;
atom : OPENPAR expr CLOSEPAR | ID ((OPENBRACKET expr CLOSEBRACKET)? | OPENPAR ((expr (COMMA)* )+)? CLOSEPAR)|
CALLOUT OPENPAR STRING (COMMA (calloutarg)+ COMMA)? CLOSEPAR | constant;
constant: INT | CHAR | boolconstant;
boolconstant: TRUE|FALSE;
丑陋的格式是因为他对调试的部分建议是采用单独的规则并将它们分解到模棱两可的地方,以查看错误的开始位置。在这种情况下,问题出在长 ID 部分,原因是 OPENBRACKET 和 OPENPAR。如果您有任何想法,我非常感激。谢谢,对于我发布的代码的格式有多糟糕,我深表歉意。