如何使用ANTLR检查有效的变量名称?

时间:2018-02-02 23:17:59

标签: antlr antlr4

我们都知道变量名不能以数字开头。 (例如,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 *不匹配?

1 个答案:

答案 0 :(得分:2)

在Antlr中,词法分析器将在解析器运行之前运行完成。解析器规则对词法分析器的行为没有影响。

因此,给定文本myId,词法分析器将发出四个ALPHA标记。这是因为ALPHA规则首先出现,ALPHAALPHANUM规则的匹配长度相同。实际上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;