ANTLR解析器和Lexer规则中的递归



i在.NET应用程序中具有ANTLR V4语法。对象可以是数组或字符串。数组是在方括号中封闭的零或更多对象的列表。字符串是括号中包含的字符序列。字符串可能包含未阐明的平衡括号,但不应包含任何不平衡的左或右括号。可以使用逃生序列()包括它们。由于将用于介绍逃生序列,因此它也需要以\的形式逃脱。

我试图以语法为代码,例如平衡括号只是字符串中的递归字符串,基本情况除外,除了逃生顺序以外。

grammar Sample ;
root
    : 'BT' object+ 'ET' EOF
    ;
object
    : array
    | String
    ;
array
    : '[' object* ']'
    ;
String
    : '(' ( StringCharacter | String )* ')'
    ;
fragment StringCharacter
    : EscapeSequence
    | ~[()\]
    ;
fragment EscapeSequence
    : '\('
    | '\)'
    | '\'
    ;
Whitespace : [ trn] -> 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}

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

我缺少从逃生序列lexer规则中的一对额外的 \

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

最新更新