Antlr4 - 获取匹配规则的名称

时间:2018-03-10 20:00:27

标签: antlr4

我创建了一个相对简单的语法,它将字符串解析并分解为子组件。语法的简化版本如下所示

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

3 个答案:

答案 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)
    {
    }
}

感谢您的建议。