我想在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 | '%' ;
但這將是非常殘酷的。
謝謝!我知道ANTLR有一些基本的東西是我誤解的......我認爲所有的驗證都必須來自於製作本身。感謝您向我展示道路。 –