私は学校向けのプロジェクトに取り組んでおり、BNF形式のカフェイン抜き仕様を文脈自由文法に変換してANTLRで構築しています。私は数週間それに取り組んでいて、行き詰まったときに教授のところに行きましたが、私はついに彼がエラーを引き起こしてはならないと言っていることに遭遇しました。これが私の文法の孤立した部分です。exprが出発点です。その前に、1つ質問があります。
レクサールールが文法のパーサールールの前に表示されるかどうか、または文法ファイル全体で断続的に混合されるかどうかは重要ですか?
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が原因であると言っています。何かアイデアがありましたら、心より感謝申し上げます。ありがとう、そして私が投稿したコードのフォーマットがいかに厄介であるか申し訳ありません。