私はこの問題に約4時間取り組んできました。これは、可能な限り単純な例になるように簡略化した ANTLR V4 文法ファイルです。
grammar Cfscript;
component
: (statement)*
;
statement
: 'return' expression? ';'
| statementExpression ';'
;
statementExpression
: expression
;
expression
: primary
| expression '.' Identifier
;
primary
: Identifier
;
Identifier
: [a-zA-Z0-9_]+
;
WS
: [ \t\r\n]+ -> skip
;
私のファイルには
local.return;
で入力してこのファイルを解析しようとするとcomponent
、次のエラーが表示されます: mismatched input 'return' expecting Identifier
. このエラーが発生する理由がわかりません。
アップデート
私の理解が正しければ、これはreturn
Java の予約語であり、そのため文法がそのように構造化されているためです。私の言語では、Coldfusion Cfscriptは、スコープが, ,return
である限り有効です。これは、 、、および他の多くの単語にも当てはまります。これらはすべてスコープ内でのみ有効ですが、変数または式の最初の項としては有効ではありません:無効ですが、有効です。これは、それらを取得するパーサー規則と競合するため、これらの用語のすべてで同じ問題に遭遇することを意味します。local.return
variables.return
local["return"]
if
else
savecontent
if.blah = "something"
blah.if = "something"
バートが述べたことを総合すると、これはこの問題を解決するためのクリーンな方法ですか?
grammar Cfscript;
component
: (statement)*
;
statement
: K_Return expression? ';'
| expression ';'
;
expression
: primary
| expression '.' secondary
;
primary
: Identifier
;
secondary
: K_Return
| K_If
| K_Else
| Identifier
;
K_Return : 'return' ;
K_If : 'if' ;
K_Else : 'else' ;
Identifier
: [a-zA-Z0-9_]+
;
WS
: [ \t\r\n]+ -> skip
;