ANTLR 解析器和词法分析器规则中的递归

Recursion in ANTLR parser and lexer rules

我在 .NET 应用程序中有一个 ANTLR v4 语法。对象可以是数组或字符串。数组是包含在方括号中的零个或多个对象的列表。字符串是括在括号中的字符序列。 String 可以包含未转义的平衡括号,但不应包含任何不平衡的左括号或右括号;可以使用转义序列 \(\) 包含它们。由于 \ 将用于引入转义序列,因此还需要将其转义为 \.

我尝试以这样的方式编写语法:平衡括号只是字符串中的递归字符串,其基本情况不允许括号,转义序列除外。

grammar Sample ;

root
    : 'BT' object+ 'ET' EOF
    ;

object
    : array
    | String
    ;

array
    : '[' object* ']'
    ;

String
    : '(' ( StringCharacter | String )* ')'
    ;

fragment StringCharacter
    : EscapeSequence
    | ~[()\]
    ;

fragment EscapeSequence
    : '\('
    | '\)'
    | '\'
    ;

Whitespace : [ \t\r\n] -> skip ;

上面的语法适用于某些值

BT [] ET
BT () ET
BT (\)) ET
BT () () ET
BT (one) (two) ET
BT [(one) (two)] ET
BT (one) [(two)] ET
BT (\() [(two)] ET
BT () [(\))] ET
BT (\)) (\)) ET

但是这个失败了

BT (\() [(\))] ET

在这种情况下,我尝试使用单个转义左括号对字符串进行编码,然后对具有单个元素的数组进行编码,该元素是具有单个转义右括号的字符串。

错误消息指出:

line: 1:13 extraneous input ']' expecting {'ET', '[', String}

我应该如何更改语法来实现我的目标?

我在转义序列词法分析器规则中遗漏了一对额外的 \

fragment EscapeSequence
    : '\('
    | '\)'
    | '\\'
    ;