ANTLR4:岛语法,令牌匹配/跳过

时间:2016-07-18 10:13:29

标签: parsing antlr4

如果用antlr4与岛屿语法作斗争,虽然我可以使它工作,但我仍然怀疑这是否是"正确的"方式。

我需要解析:

Some random text
{ }

@if(condition) {
   more random text
   @foobar
   @if (condition2) {
        random text {}
   }
}

问题在于背景:一个"狂野" {}不是任何东西,但如果它是语言运算符后面的{},那么{}就会变得有意义。 (读:它打开并关闭一个块)

在上面的情况中,假设条件和条件2都为真,它将返回以下内容:

Some random text
{}
more random text
random text {}

我对选择哪条路线感到困惑,对上述建议有何建议?

原始实现似乎匹配大括号:

{ }

@if (true) {
    { 
    foo 
    bar  
    } }

产量

{ }
{
foo
bar
}

{ }

@if (true) {
{ 
    foo 
    bar  
    }

产生解析错误。

1 个答案:

答案 0 :(得分:0)

这可以通过特定于上下文的词法分析器来解决。在这种情况下,通过跟踪条件/块开口,我们可以确定这是模板内容,还是实际的块打开/关闭。

参见ANTLR4最终ANTLR4参考文献的p219。