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
: '\('
| '\)'
| '\\'
;