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