1
なぜ以下の文法がブール値を認識しないのですか?ANTLR4文法がブールリテラルを認識しない
私はこれをJavaとGraphQLの両方の文法と比較しています。なぜそれが動作しないのかわかりません。
foo = null // foo = value:nullValue
foo = 123 // foo = value:numberValue
foo = "Hello" // foo = value:stringValue
foo = true // line 1:6 mismatched input 'true' expecting {'null', STRING, BOOLEAN, NUMBER}
は何が問題である:
を解析し、以下の文法を考えると、次のようにありますか?grammar issue;
elementValuePair
: Identifier '=' value
;
Identifier : [_A-Za-z] [_0-9A-Za-z]* ;
value
: STRING # stringValue | NUMBER # numberValue | BOOLEAN # booleanValue | 'null' #nullValue
;
STRING
: '"' (ESC | ~ ["\\])* '"'
;
BOOLEAN
: 'true' | 'false'
;
NUMBER
: '-'? INT '.' [0-9]+| '-'? INT | '-'? INT
;
fragment INT
: '0' | [1-9] [0-9]*
;
fragment ESC
: '\\' (["\\/bfnrt] )
;
fragment HEX
: [0-9a-fA-F]
;
WS
: [ \t\n\r]+ -> skip
;
まず、レクサーが最も長い試合を試行することに注意してください。 'BOOLEAN'が何よりも多くの入力にマッチすれば、' Identifier'ルールはマッチします。 'BOOLEAN'はレクサーによって選択されます。例えば、 'Identifier'(' false'と 'true'の場合は3)にマッチした文字の数を制限するために述語を使うことができます。そうすれば、文法はこれらのキーワードに一致します。 –
ありがとう@MikeLischkeと十分に真実。しかし、OPの文法における第2のルールとしてのレクサールールの非正統な混合が、彼が記述した問題の根本的な原因であった。私は以前も同様に困惑していました。単に、トークンモードでTestRigを実行すると、 "a-ha!"瞬間 – TomServo
確かに、非常に一般的な問題です。 –