我将antlr4与javascript目标一起使用。
这是一个示例语法:
P : T ;
T : [a-z]+ {console.log(this.text);} ;
start: P ;
当我运行生成的解析器时,虽然输入匹配,但不会打印任何内容。如果我将操作移动到令牌P
,则会调用它。那是为什么?
答案 0 :(得分:2)
引用的规则中会忽略操作。这是ANTLR 4的原始行为,当词法分析器仅支持每个令牌的单个操作时(该操作必须出现在令牌的末尾)。
之后的几个版本解除了对每个规则的一个操作的限制,允许为令牌执行任意数量的操作。但是,我们发现许多现有用户依赖于原始行为,并编写了他们的语法,假设被引用规则中的操作被忽略。许多这些语法在这些规则中使用了复杂的逻辑,因此改变行为将是一个严重的突破性变化,会阻止人们使用新版本的ANTLR 4。
我们决定保留原始行为并且仅执行与匹配令牌在同一规则中出现的操作,而不是打破这么多现有的ANTLR 4词法分析器。较新的版本允许您在每个规则中放置多个操作。
tl; dr:我们考虑过允许其他规则中的操作执行,但决定不执行,因为它会破坏很多人已经编写和使用的语法。
答案 1 :(得分:0)
我发现@init和@after actions会覆盖此默认行为。 将示例代码更改为:
grammar Test;
ALPHA : [a-z]+;
p : t ;
t
@init {
console.log(this.text);
}
@after {
console.log(this.text);
}
: ALPHA;
start: p ;
我将解析器规则更改为LOWER case,因为我的Eclipse工具正在抱怨语法。我还必须为[a-z] +插入ALPHA;出于同样的原因。编译了上面的文本,但我还没有尝试运行生成的解析器。但是,我在我的大型解析器中使用@ init / @成功解决了这个问题。
希望这有用。