【发布时间】:2018-06-05 09:43:31
【问题描述】:
我对 ANTLR 很陌生,我需要解释一下它在识别输入字符串时的行为。据我了解,以大写字母开头的规则是词法分析器规则,而以小写字母开头的规则是解析器规则。
我有以下语言,我需要相应地编写语法:
所以 L 应该接受由以下组成的所有字符串:
- b 和/或 c 的非空字符串
- d
- 带有 a 和/或 c 的非空字符串
这是我写的第一个语法,识别输入bbbcbcbcbcdaaacacacaaaa时没有问题:
start : (alfa 'd' beta);
alfa : ('b'|'c') | ('b'|'c') alfa;
beta : ('a'|'c') | ('a'|'c') beta;
WS : (' '|'\n'|'\t'|'\r')->skip;
但是如果我像下面这样改变它,相同的字符串将不再被识别(你可以在下面看到 ANTLRWorks 的调试器结果):
start : (alfa 'd' beta);
alfa : ALFA_VALS | ALFA_VALS alfa;
beta : BETA_VALS | BETA_VALS beta;
ALFA_VALS: ('b'|'c');
BETA_VALS: ('a'|'c');
WS : (' '|'\n'|'\t'|'\r')->skip;
此外,如果我将ALFA_VALS 和BETA_VALS 分别更改为alfa_vals 和beta_vals,则不会出现任何问题。
有人可以解释一下这种行为吗?因为我找不到解决此问题的特定解决方案。
非常感谢!
【问题讨论】:
-
我建议您使用 ANTLR v4 而不是您现在使用的旧 v3。