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

How do I use ANTLR to check for valid variable names?

我们都知道变量名不能以数字开头。 (例如,foo1 有效,1foo 无效)。

我正在尝试编写一个只允许有效变量名的语法文件,并且它们后面必须跟一个冒号。 (这是一个更大的语法的一部分 - 我只是停留在这一部分)

看起来应该很简单。我定义了一个规则 id,它只接受一个字母值作为它的第一个字符,后面跟着任意数量的字母数字字符。然而,看似简单的任务对我来说却失败了。谁能解释一下为什么?

这是我的语法:

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* 不匹配任何东西?

在 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;