我们都知道变量名不能以数字开头。 (例如,foo1有效,1foo不是)。
我正在尝试编写语法文件以仅允许有效的变量名称,并且必须后跟冒号。 (这是一个更大的语法的一部分 - 我只是坚持这一部分)
看起来应该很简单。我定义了一个规则 id ,它只接受一个alpha值作为其第一个字符,后跟任意数量的字母数字字符。然而,看起来像一个简单的任务对我来说是失败的。任何人都可以解释原因吗?
这是我的语法:
grammar validName;
var_declaration :VAR id COLON;
VAR: 'var';
COLON: ':';
DIGIT: [0-9];
ALPHA: [a-zA-Z_];
ALPHANUM: ALPHA | DIGIT;
id: ALPHA ALPHANUM*;
WS: [ \n\t\r]+ -> skip;
这是我的测试输入:
var myId :
这是错误:
line 1:5 mismatched input 'y' expecting ':'
为什么ALPHANUM *不匹配?
答案 0 :(得分:2)
在Antlr中,词法分析器将在解析器运行之前运行完成。解析器规则对词法分析器的行为没有影响。
因此,给定文本myId
,词法分析器将发出四个ALPHA
标记。这是因为ALPHA
规则首先出现,ALPHA
和ALPHANUM
规则的匹配长度相同。实际上ALPHANUM
永远不会匹配,因为之前列出了DIGIT
。
尝试:
var_declaration :VAR ID COLON;
VAR: 'var';
ID: ALPHA ( ALPHA | DIGIT )*;
COLON: ':';
DIGIT: [0-9];
ALPHA: [a-zA-Z_];
WS: [ \n\t\r]+ -> skip;