2017-05-26 9 views
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 
    ; 

答えて

2

トークン「真」は字句解析ルール識別子と一致するので、それは動作しません:

[@0,0:2='foo',<Identifier>,1:0] 
[@1,4:4='=',<'='>,1:4] 
[@2,6:9='true',<Identifier>,1:6] <== lexed as an Identifier! 
[@3,14:13='<EOF>',<EOF>,3:0] 
line 1:6 mismatched input 'true' expecting {'null', STRING, BOOLEAN, NUMBER} 

は、字句解析ルールの中であることを遠くダウン識別子のあなたの定義を移動し、それが動作します:

NUMBER 
    : '-'? INT '.' [0-9]+| '-'? INT | '-'? INT 
    ; 

Identifier : [_A-Za-z] [_0-9A-Za-z]* ; 

上部のものは下部にあるものを覚えています。あなたのような結合された文法では、(大文字で始まる)レクサーの規則に(小文字で始まる)パーサー規則を散在させないでください。

+1

まず、レクサーが最も長い試合を試行することに注意してください。 'BOOLEAN'が何よりも多くの入力にマッチすれば、' Identifier'ルールはマッチします。 'BOOLEAN'はレクサーによって選択されます。例えば、 'Identifier'(' false'と 'true'の場合は3)にマッチした文字の数を制限するために述語を使うことができます。そうすれば、文法はこれらのキーワードに一致します。 –

+0

ありがとう@MikeLischkeと十分に真実。しかし、OPの文法における第2のルールとしてのレクサールールの非正統な混合が、彼が記述した問題の根本的な原因であった。私は以前も同様に困惑していました。単に、トークンモードでTestRigを実行すると、 "a-ha!"瞬間 – TomServo

+0

確かに、非常に一般的な問題です。 –

関連する問題