我在.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}
我应该如何更改语法以实现目标?
答案 0 :(得分:1)
我从转义序列词法分析器规则中错过了一对额外的\\
:
fragment EscapeSequence
: '\\('
| '\\)'
| '\\\\'
;