如何在不改变语法的情况下知道ANTLR解析器在访问期间当前处于哪个替代规则中语法、不改变、情况下、规则

2023-09-04 01:46:33 作者:泪已决堤

我看了这些,它们似乎没有解决问题:

Is there a way to know which alternative rule ANTLR parser is currently in?

基于 ANTLR 自己实现一个 SQL 解析器

How to know which alternative rule ANTLR parser is currently in during visit

例如:

oC_ListOperatorExpression : 
( SP IN SP? oC_PropertyOrLabelsExpression ) 
| ( SP? '[' oC_Expression ']' ) 
| ( SP? '[' oC_Expression? '..' oC_Expression? ']' ) ; 

在此特定情况下,备选方案2和备选方案3在固定位置没有特殊的记号或记号,我可以利用它们来区分它们。

如何才能在不更改语法的情况下辨别我在以下内容中使用的备选方案?

antlrcpp::Any visitOC_ListOperatorExpression( 
 CypherParser::OC_ListOperatorExpressionContext* ctx) override {
} 

我使用的是ANTLR4 4.9.3.1的C++运行时。

完整语法: https://s3.amazonaws.com/artifacts.opencypher.org/M18/Cypher.g4

推荐答案

您可以向最后一个备选方案中的两个oC_Expression添加标签。然后,您可以检查它们是否存在。

(甚至只检查第二个oC_Expression