我创建了一个相对简单的语法,它将字符串解析并分解为子组件。语法的简化版本如下所示
stmt: location type ID;
location :
location_A
| location_B
| location_C
;
location_A : 'LOCATION TOKEN 1';
location_B : 'LOCATION TOKEN 2';
location_C : 'LOCATION TOKEN 3';
在我的监听器中,我已经实现了ExitLocation以捕获与此规则匹配的令牌,但我还想提取与该令牌匹配的子规则的规则名称(即location_A / B / C)。 / p>
是否可以从侦听器中确定哪个子规则与找到的令牌匹配?
祝福 Dines Madsen
答案 0 :(得分:1)
Alternative labels会在这里帮到你。 使用唯一#name
:
location
: location_A #alt1
| location_B #alt2
| location_C #alt3
;
在您的听众和访问者中,有enter
- 和exit
- 为这些标签创建的方法(exitAlt1(...)
,exitAlt2(...)
,...)。
答案 1 :(得分:0)
另一种选择是将子规则的结果(默认为规则上下文)分配给局部变量,并在监听器中检查:
location:
value = location_A
| value = location_B
| value = location_C
;
LocationContext.value
然后包含匹配的位置规则。
答案 2 :(得分:0)
我最终只是从子节点抓取上下文名称。由于此信息仅用于调试目的,因此应该足够了:
public override void ExitLocations([NotNull] TagParserParser.LocationsContext context)
{
try
{
this.myLocationToken = context.GetText();
this.myLocationRule = context.children[0].GetType().Name;
}
catch (Exception)
{
}
}
感谢您的建议。