我如何在 antlr4 中做嵌套括号?

How do I do nested parenthesis in antlr4?

我有以下语法

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 添加到各个位置来解决此问题,但无济于事。任何帮助都会很棒。

根据您的语法,查询是:

  • 一个或多个 unquoted_str 的序列,或

  • 一个(,一个query,一个)

abc (def)query吗?

没有。 (def) 不是 unquoted_str,因此第一个选项不适用。并且 abc 不以 ( 开头,因此第二个选项也不适用。因为这是唯一的两个选项,我们得出结论,它不是。所以做了 Antlr;它告诉你在它看到一个 unquoted_str (abc) 之后,它希望看到另一个,或者输入结束。

从你的例子来看,我想你的意思可能是查询是一个或多个查询元素,其中查询元素是单个 unquoted_str 或带括号的 query。如果那是你的意思,你应该改变你的语法来指定那个。