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;
Bool_Literalルールを上げた後で動作します。ありがとう! – Wayne