如何区分ANTLR 4中的子规则?

时间:2016-04-09 22:31:03

标签: antlr antlr4

我的语法有这样的规则:

function read_confirm
  while true
    read -p 'echo "Confirm? (y/n):"' -l confirm

    switch $confirm
      case Y y
        return 0
      case '' N n
        return 1
    end
  end
end

我需要区分解析器应用程序中的规则。我知道我可以标记每个替代方案,但我不想修改语法,因为我使用grammars-v4存储库来保持语法最新。

还有其他易于使用的选项吗?或者我应该承认,如果不修改语法,我就无法制作我的应用程序?

1 个答案:

答案 0 :(得分:0)

当然你可以做到,但没有其他标签会更棘手。 在访问者或监听者方法中,您可以通过以下方式区分它们:

if (context.arrow_operator() != null)
{
    if (context.GetChild(1).GetText() == "rethrows")
    {
        // rule 4
    }
    else
    {
        // rule 3
    }
}
else if (context.type_identifier() != null)
{
    // rule 5
}
else
...
else if (context.type().Length == 2)
{
    // rule 2
}
else
{
    ...
}