如果用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
}
产生解析错误。
答案 0 :(得分:0)
这可以通过特定于上下文的词法分析器来解决。在这种情况下,通过跟踪条件/块开口,我们可以确定这是模板内容,还是实际的块打开/关闭。
参见ANTLR4最终ANTLR4参考文献的p219。