我如何使用 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
规则先出现,并且 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;
我们都知道变量名不能以数字开头。 (例如,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
规则先出现,并且 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;