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

时间:2018-02-27 14:40:50

标签: .net antlr antlr4

我在.NET应用程序中有一个ANTLR v4语法。对象可以是数组或String。数组是括在方括号中的零个或多个对象的列表。 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}

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

1 个答案:

答案 0 :(得分:1)

我从转义序列词法分析器规则中错过了一对额外的\\

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