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