如何在antlr4中执行嵌套括号?

时间:2015-02-10 02:29:55

标签: nested grammar dsl antlr4 nested-lists

我有以下语法

query
    : unquoted_str+
    | '(' query ')'
    ;

unquoted_str
    : UNQUOTED_STR
    ;

UNQUOTED_STR
    : [A-Za-z_][A-Za-z0-9_-]*
    ;
WS
    :   [ \t\r\n]+ -> skip
    ;

我希望能够执行以下查询:

  

abc (def (hij))

但我一直收到错误:

line 1:4 extraneous input '(' expecting {<EOF>, UNQUOTED_STR}
line 1:8 extraneous input ')' expecting {<EOF>, UNQUOTED_STR}

尝试通过在各个地方添加EOF来解决问题,但无济于事。任何帮助都会很棒。

1 个答案:

答案 0 :(得分:1)

根据你的语法,查询是:

  • 一个或多个unquoted_str s或

  • 的序列
  • ,a query

abc (def)query吗?

没有。 (def)不是unquoted_str,因此第一个选项不适用。并且abc不以)开头,因此第二个选项也不适用。由于这些是唯一的两个选项,我们得出的结论是它不是.Antlr也是如此。它告诉你,在看到unquoted_strabc)之后,它会看到另一个或输入结束。

从您的示例中,我认为您可能认为查询是一个或多个查询元素,其中查询元素是单个unquoted_str或带括号的query。如果这就是你的意思,你应该改变你的语法以指定它。