2012-04-28 26 views
2

我爲字符串變量聲明編寫了以下語法。字符串的定義與單引號之間的任何內容一樣,但必須通過使用$字母來轉義字符串值來添加單引號。ANTLR詞法分析器中的特殊字符處理

grammar test; 

options  
{ 
    language = Java; 
} 


tokens 
{ 
    VAR = 'VAR'; 
    END_VAR = 'END_VAR'; 
} 


var_declaration: VAR string_type_declaration END_VAR EOF; 

string_type_declaration: identifier ':=' string; 

identifier: ID; 

string: STRING_VALUE; 

STRING_VALUE: '\'' ('$\''|.)* '\''; 

ID: LETTER+; 

WSFULL:(' ') {$channel=HIDDEN;}; 

fragment LETTER: (('a'..'z') | ('A'..'Z')); 

此語法不起作用,如果您嘗試運行var_declaration規則驗證碼:

VAR A :='$12.2' END_VAR 

我得到MismatchedTokenException異常。

但這個代碼工作正常string_type_declaration規則:

A :='$12.2' 

回答

5

STRING_VALUE沒有正確標記化。在循環(...)*內,$需要在它後面有一個單引號,但輸入字符串'$12.2'$後沒有引號。您應該使單引號可選('$' '\''? | .)*。但是,現在你選擇的循環中,.,也將匹配一個單引號:最好讓它比一個單引號和$匹配其他任何東西:

STRING_VALUE 
: '\'' ('$' '\''? | ~('$' | '\''))* '\'' 
; 

導致以下分析樹:

enter image description here