2016-09-20 4 views
1

ANTLR4を使用してブールリテラルを定義するための文法を作成しようとしています。 "BOOL#TRUE"または単に "TRUE"のいずれかの形式を取ることができます。ANTLR4でオプション部分を使用して字句規則を作成する方法

私はこのような字句規則としてそれを定義した場合:

Bool_Literal : ('BOOL' '#')? ('FALSE' | 'TRUE');  

ANTLRは、入力が一致することはできません。

isHigh := FALSE; 

エラーは "Bool_Literalを期待不一致入力 'FALSE'" です。

しかし、私は文法規則に変更した場合:

bool_literal : ('BOOL' '#')? ('FALSE' | 'TRUE'); 

それは正しく「BOOL番号をFALSE」または単に「FALSE」のいずれかを拾うことができます。

オプションの部分で始まるトークンをレキシカルルールで検出できないようですが、その理由は誰にもわかりますか?

ありがとうございます!

ウェイン

にここでは私の文法である:


grammar TT; 

pou 
    : assignment + 
    ; 

assignment : Identifier ':=' expression ';' ; 
expression : primary_expr ; 
primary_expr : Bool_Literal; 

//bool_literal   : ('BOOL' '#')? ('FALSE' | 'TRUE'); 

// lexical 
fragment Letter   : [a-zA-Z]|'_' ; 
fragment Digit   : [0-9]; 
fragment Bit   : [0-1]; 
fragment Octal_Digit : [0-7]; 
fragment Hex_Digit  : [0-9a-fA-F]; 

Identifier   : Letter (Letter|Digit)*; 

Bool_Literal   : ('BOOL' '#')? ('FALSE' | 'TRUE'); 

WS  : [ \n\r\t]+ -> channel(HIDDEN) ; 
Comment  : '//' .*? '\n' -> channel(HIDDEN); // channel COMMENTS) //  
EOL   : '\n'; 

私のテスト入力:

isLow := BOOL#TRUE; 
isLow2 := BOOL#FALSE; 
isHigh := FALSE; 

答えて

2

ANTLRは、ほとんどの字句スキャナ発電機のような、を優先しますトークンと一致する最初のルール可能な限り長いトークンを2つ以上のルールで一致させることができます。

文法では、TRUEFALSEは、識別子またはブールリテラルのいずれかと照合できます。識別子の規則は文法の早い方から来るので、それが勝つのでFALSEが識別子になります。

ルールは、bool_literalルールが表示されます(または少なくともidentifierルールの前に表示されます)。その後、代わりに勝ちます。

「キーワードが識別子として扱われているのはなぜですか?」という質問を参照してください。 this Antlr4 FAQ

+0

Bool_Literalルールを上げた後で動作します。ありがとう! – Wayne

関連する問題