ANTLR单元也是一个标识符

ANTLR单元也是一个标识符,antlr,antlr4,Antlr,Antlr4,我试图在ANTLR中创建一个更少的解析器,并使用Twitter引导的更少文件进行测试。我大部分时间都在工作,但有一部分让我感到困惑,我想这是因为我没有完全摸索ANTLR 在本报告中,有以下几点: .directional(@start-color: #555; @end-color: #333; @deg: 45deg) { background-repeat: repeat-x; background-image: -webkit-linear-gradient(@deg, @star

我试图在ANTLR中创建一个更少的解析器,并使用Twitter引导的更少文件进行测试。我大部分时间都在工作,但有一部分让我感到困惑,我想这是因为我没有完全摸索ANTLR

在本报告中,有以下几点:

.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
标记没有被解析为
变量,而是被解析为
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
解析为
变量
,而
45deg
解析为
度量


我知道我可以作弊并定义
unit:Identifier |'%'但那将是非常糟糕的。

你需要重新定义你的
单元
规则,正如你在问题末尾所描述的那样。这不是“作弊”。事实上,只要生成的语法是不明确的,就可以极大地提高将来扩展语法以接受其他类型单位的能力


您可以为侦听器或访问者中的单元验证特定的
标识符
,该单元在初始解析完成后执行。

谢谢!我知道ANTLR有一些基本的东西是我误解的。。。我认为所有的验证都必须来自制作本身。谢谢你给我指路。