2014-01-27 58 views
0

我想在ANTLR中創建一個LESS解析器,並且我正在使用Twitter Bootstrap的LESS文件進行測試。我已經掌握了它的主要工作,但有一個部分阻礙了我,我認爲這是因爲我沒有完全理解ANTLR。ANTLR單元也是一個標識符

less/mixins.less,有mixin declaration如下:

.directional(@start-color: #555; @end-color: #333; @deg: 45deg) { 
    background-repeat: repeat-x; 
    background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+ 
    background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+ 
} 

說的掛了我的分析器的事情是,有相同名稱爲單位的變量。 @deg令牌,而不是被解析爲variable,被解析爲Asperand unit,而不是(因爲deg是一個單位)。由於這是無效的,解析器退出。我試過在我的ANTLR文件中重新排列我的聲明的順序,但它仍然不起作用。

子集我的語法:

varAssignment 
    : variable w Colon w expr 
    ; 

expr 
    : expr w term w 
    | expr w Comma w term w 
    | term w 
    ; 

term 
    : variable 
    | measurement 
    ; 

variable 
    : Asperand Identifier 
    ; 

// Insignificant whitespace. 
w: (W | Comment)*; 

Identifier 
    : NameStart NameChar* 
    ; 

Ampersand: '&'; 
Asperand: '@'; 
Comma:  ','; 
Semi:  ';'; 
Colon:  ':'; 
Ellipsis: '...'; 

OpenBlock: '{'; 
CloseBlock: '}'; 
OpenParen: '('; 
CloseParen: ')'; 
OpenSquare: '['; 
CloseSquare:']'; 

W: (' ' | '\t' | '\n' | '\r' | '\f')+; 


number: Number; 
Number: Dgt+ | Dgt* '.' Dgt+; 

fragment NameChar 
    : NameStart 
    | Dgt 
    ; 
fragment NameStart 
    : 'a'..'z' | 'A'..'Z' | '-' 
    ; 
fragment Dgt 
    : '0'..'9' 
    ; 


unit:'%' 
    |'px' 
    |'em' 
    |'ex' 
    |'in' 
    |'cm' 
    |'mm' 
    |'pc' 
    |'deg' 
    |'rad' 
    |'grad' 
    ; 


measurement 
    : Number unit? 
    ; 

我會如何重新安排我的聲明,以使@deg解析爲variable,但45deg解析爲measurement

我知道我可以作弊並定義unit: Identifier | '%' ;但這將是非常殘酷的。

回答

1

您需要重新定義您的unit規則,正如您在問題結尾處所述。這不是「作弊」。事實上,只要你的結果語法不明確,它將大大提高你將來擴展語法的能力,以接受其他類型的單位。

您可以驗證具體的Identifier是否在初始解析完成後執行的偵聽器或訪問器中的單元。

+0

謝謝!我知道ANTLR有一些基本的東西是我誤解的......我認爲所有的驗證都必須來自於製作本身。感謝您向我展示道路。 –

相關問題