2012-06-13 72 views
0

我嘗試用ANTLR製作一個具有以下特徵的文法。ANTLR中有>和空白區域的標識符可能嗎?

它可以解析像的標識符:

foo > bar > 67 

其中foo>欄是標識符,因爲如果>後跟一個字母它包含識別符和它的其他操作者相比更大。

我應該解析之類的東西

((a = 1) AND (b = 2)) OR (c = 3) 

,其中()是必要的。

我對這個話題和ANTLR真的很陌生,希望有人能幫忙。

我目前有這個語法

grammar testgrammer; 

start : statement EOF; 

statement 
    : operation (AND operation)*; 

operation 
    : '(' ID OPERATOR INT ')'; 

AND : 'AND'; 

OPERATOR: '=' | '>'; 

ID 
    : ('a'..'z'| 'A'..'Z')+ (WS '>' WS ('a'..'z' | 'A'..'Z')+)? 
    ; 

WS 
    : ' '+ {skip();} 
    ; 

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

但在一個ID,我不能之間>找出HOWTO開關和>作爲操作員。

+0

你已經嘗試過自己的東西嗎? –

+0

我目前嘗試,但antlrworks的一些問題,但我嘗試儘快更新 – Sebastian

回答

1

首先,這是一個令人困惑的事情:"foo > bar"是一個標識符和"foo > 67"表達式。

由於您允許這樣的標識符內的空格,您的詞法分析器將跳過輸入,如"foo > 67",因爲在"foo > "之後它將嘗試消耗一個字母,但會看到一個數字。詞法分析器不會從"foo > "回溯,因爲沒有可以從它創建的單個標記(請注意,詞法分析器永遠不會放棄它消耗的字符!)。

爲了解決這個問題,您必須確保詞法分析器可以匹配" > "後跟一些字母。你可以做,使用語法謂詞((...)=>部分):因爲這條規則調用skip()方法,你不能使用規則SpaceCharsId

Id 
: IdPart ((Spaces? '>' Spaces? IdPart)=> Spaces? '>' Spaces? IdPart)* 
; 

SpaceChars 
: (Spaces | '\r' | '\n') {skip();} 
; 

fragment Digit : '0'..'9'; 
fragment Letter : 'a'..'z' | 'A'..'Z'; 
fragment Spaces : (' ' | '\t')+; 
fragment IdPart : Letter (Letter | Digit)*; 

注意。

+0

謝謝,是有點令人困惑,但只有我的測試 – Sebastian

+0

不客氣@塞巴斯蒂安。 –