ANTLR单位也是一个标识符



我正在尝试在ANTLR中创建一个LESS解析器,并且我正在使用Twitter Bootstrap的LESS文件进行测试。我让它大部分工作,但有一个部分让我难倒,我认为这是因为我没有完全理解 ANTLR。

在 less/mixins.less 中,有一个 mixin 声明,如下所示:

.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 | '%' ;但那将是相当残暴的。

您需要重新定义unit规则,如问题末尾所述。这不是"作弊"。事实上,只要你得到的语法是模棱两可的,它就会大大提高你将来扩展语法以接受其他类型的单元的能力。

您可以在初始分析完成后执行的侦听器或访客中验证单元的特定Identifier

相关内容

  • 没有找到相关文章

最新更新