我有以下语法:
grammar lab02;
@header{
package laboratorios.lab02;
}
word : [a-z]+ ;
op_plus : '+' ;
op_min : '-' ;
op_mul : '*' ;
op_div : '/' ;
WS : [ \t\r\n]+ -> skip ;
digit : ('0'|'1'|'2'|'3'|'4'|'5'|'6'|'7'|'8'|'9') ;
这会出错:error(50): lab02.g4:7:10: syntax error: 'a-z' came as a complete surprise to me while matching alternative.
我已经从示例中复制了它,但它在我的计算机上无法正常工作。看看数字规则:digit : ('0'|'1'|'2'|'3'|'4'|'5'|'6'|'7'|'8'|'9') ;
就是这样,因为这是它不会报告错误的唯一方法。如果我使用[0-9] +我得到:
error(50): lab02.g4:7:10: syntax error: '0-9' came as a complete surprise to me while matching alternative
你知道为什么这不起作用吗?
答案 0 :(得分:4)
在ANTLR中,以小写字母开头的规则是解析器规则,而以大写字母开头的规则是词法分析器规则。
您正在尝试在此处定义词法规则,因此您必须以大写字母开头。
WORD : [a-z]+ ;
OP_plus : '+' ;
OP_min : '-' ;
OP_mul : '*' ;
OP_div : '/' ;
WS : [ \t\r\n]+ -> skip ;
DIGIT : [0-9] ;
您的规则digit: ('0'|'1'|'2'|'3'|'4'|'5'|'6'|'7'|'8'|'9');
实际上对解析器规则有效,这就是它编译的原因,但它会隐式地为每个数字创建一个令牌类型,这是不好的。