2012-08-10 83 views
1

我正在處理一個antlr問題。在我的小型自定義DSL中,我希望能夠在字段之間執行比較操作。我有三個字段類型(String,Int,Identifier),標識符是一個變量名。我做了一個很大的規範,但我已經將我的問題縮小到了一個更小的語法。Antlr字符串不能匹配

問題是,當我嘗試使用可以使用antlrworks添加到您的語法的String語法表示法時,我的字符串被視爲標識符。這是我的語法:

grammar test; 

x 
    : 'FROM' field_value EOF 
    ; 

field_value 
    : STRING 
    | INT 
    | identifier 
    ; 

identifier 
    : ID (('.' '`' ID '`')|('.' ID))? 
    | '`' ID '`' (('.' '`' ID '`')|('.' ID))? 
    ; 

ID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')* 
    ; 

INT : '0'..'9'+ 
    ; 

STRING 
    : '"' (ESC_SEQ | ~('\\'|'"'))* '"' 
    ; 

fragment 
HEX_DIGIT : ('0'..'9'|'a'..'f'|'A'..'F') ; 

fragment 
ESC_SEQ 
    : '\\' ('b'|'t'|'n'|'f'|'r'|'\"'|'\''|'\\') 
    | UNICODE_ESC 
    | OCTAL_ESC 
    ; 

fragment 
OCTAL_ESC 
    : '\\' ('0'..'3') ('0'..'7') ('0'..'7') 
    | '\\' ('0'..'7') ('0'..'7') 
    | '\\' ('0'..'7') 
    ; 

fragment 
UNICODE_ESC 
    : '\\' 'u' HEX_DIGIT HEX_DIGIT HEX_DIGIT HEX_DIGIT 
    ; 

當我嘗試解析以下字符串FROM "Hello!"返回這樣

 <grammar test> 
      | 
      x 
      | 
---------------------------- 
|   |    | 
FROM field_value  ! 
      | 
     identifier 
      | 
      "Hello 

一個分析樹它解析什麼,我認爲應該是一個字符串的標識符以爲我標識符沒有按不要說任何關於雙重平價的事情,所以它不應該匹配。

此外,我認爲我的字符串定義是錯誤的,即使antlrworks爲我生成它。有人知道爲什麼會發生這種情況嗎?

乾杯!

回答

1

你的語法沒有問題。讓你感到困惑的事情很可能是你使用ANTLRWorks的解釋器。別。口譯員工作不好。

使用ANTLRWorks',而不是調試器(在你的語法,按CTRL +d),它就像一個魅力。這是解析FROM "Hello!"以後有什麼調試器顯示:

enter image description here

+0

那麼有一個問題...在我目前的位置,我沒有訪問java編譯器...我會檢查你的解決方案時,我用編譯器到達了一臺計算機。乾杯! – bkwint 2012-08-10 08:55:48

+0

@bkwint,或許你的大文法有問題,但是你發佈的語法絕對沒有問題。 – 2012-08-10 09:04:21

+0

較大的語法工作正常,直到我讀取field_value ...它出現錯誤的格式完全相同。所以我希望這是唯一會發生的問題!當你看到聲望出現時,你會知道你的解決方案是否正確! – bkwint 2012-08-10 09:09:29