Я пытаюсь создать грамматику для определения булевого литерала с помощью ANTLR4. Он может принимать форму «BOOL # TRUE» или просто «TRUE».Как создать лексические правила с необязательной частью в ANTLR4
если определить его как лексическое правило, как это:
Bool_Literal : ('BOOL' '#')? ('FALSE' | 'TRUE');
Antlr может не совпадать вход:
isHigh := FALSE;
ошибка является "несовпадающим ввод 'FALSE' ожидает Bool_Literal".
Но если я изменить его правила грамматики:
bool_literal : ('BOOL' '#')? ('FALSE' | 'TRUE');
может правильно подобрать либо «BOOL FALSE #» или просто «FALSE».
Кажется, что лексическое правило не может обнаружить токен, который начинается с необязательной части, кто-нибудь знает почему?
Спасибо!
Wayne
Вот моя грамматика:
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