场景:
- 我收到一种神秘的语言,语法显然非常深刻
- 巨大的 10k 混乱,在一行上,代表 1 个神秘语言的陈述
- 假设我最初并不关心深层语法
- 我只想根据嵌套括号重新格式化它
我的简体语言规则:
- 大部分文本我不在乎,我只想按原样保存
- 打开 paren 意味着打开一个新级别;匹配结束 paren 意味着完成该级别
- 可以在同一级别上用逗号分隔多个括号,尽管我并不真正关心这一点
- 可以有多个相邻的左括号和右括号
- 在第一个括号之前和最后一个括号之后可能有也可能没有文本
我尝试了一堆不同的语法,从Antlr 4参考书中的ArrayInit示例开始。
这是一次失败的尝试:
grammar NestedParens ;
init: STR* ( '(' value (value)* ')' )* STR* ;
value: init
| STR
;
STR: [^()]+ ;
ANTLR给出的错误:
"error(153): NestedParens.g4:5:0: rule init 包含一个闭包,其中包含至少一个可以匹配空字符串的替代项"
(行号可能与我发布的内容不一致)
一些想法:
- 我认为有效的零长度字符串是一个问题,但不确定如何考虑它们
- 也许我相信总是自上而下的Antlr不是正确的工具?
- 也许有一个更简单的工具,可以让您只指定您关心匹配的参数、大括号、括号等?
试试这个语法:
grammar NestedParens ;
init: STR* ( '(' value (value)* ')' ) STR* ;
value: init
| STR
;
STR: [^()]+ ;
不同之处在于缺少一个*
,这使得您的版本中的空字符串匹配init
(antlr 编译器抱怨的错误)不再匹配。
这也将起作用:
grammar NestedParens ;
init: STR* ( '(' value (value)* ')' )+ STR* ;
value: init
| STR
;
STR: [^()]+ ;