2016-09-20 56 views
1

我想創建一個使用ANTLR4定義布爾文本的語法。它可以採用「BOOL#TRUE」或「TRUE」的形式。如何使用ANTLR4中的可選部分創建詞法規則

,如果我把它定義爲一個詞法規則是這樣的:

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

ANTLR的無法比擬的輸入:

isHigh := FALSE; 

錯誤是 「不匹配輸入 '假' 預期Bool_Literal」。

但是,如果我將其更改爲一個語法規則:

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

它可以正確地拿起無論是「BOOL#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的,最喜歡的詞彙掃描程序生成,會優先給與令牌匹配的第一條規則在最長可能的標記可以被兩個或更多規則匹配的情況下。

在您的語法中,TRUEFALSE可以作爲標識符或布爾文字匹配。由於標識符規則在語法中較早出現,因此它將獲勝,因此FALSE將成爲標識符。

因此,將Bool_literal規則放在bool_literal規則出現的地方 - 或者至少在identifier規則之前 - 然後它會取勝。

查看問題「爲什麼我的關鍵字被當作標識符對待?」在this Antlr4 FAQ

+0

它在我向上移動Bool_Literal規則後生效。謝謝! – Wayne

相關問題