Regex 正在尝试使用antlr4进行“简单”解析以重新格式化/漂亮打印

Regex 正在尝试使用antlr4进行“简单”解析以重新格式化/漂亮打印,regex,antlr4,pretty-print,parentheses,Regex,Antlr4,Pretty Print,Parentheses,情景: 我收到了一种神秘的语言,显然语法很深 巨大的10k混乱,在一行上,代表一种神秘的语言 假设我一开始并不关心深层语法 我要做的就是根据嵌套的括号重新格式化它 我的简化语言规则: 大部分我不关心的文本,我只想保持原样 打开paren意味着打开一个新的层次;匹配结束参数意味着完成该级别 可以在同一级别使用多个括号,并用逗号分隔,尽管我并不真正关心这一点 可以有多个相邻的左括号和右括号 在第一个段落之前和最后一个段落之后可能有文本,也可能没有文本 我尝试了很多不同的语法,从Antlr 4参考书中

情景:

我收到了一种神秘的语言,显然语法很深 巨大的10k混乱,在一行上,代表一种神秘的语言 假设我一开始并不关心深层语法 我要做的就是根据嵌套的括号重新格式化它 我的简化语言规则:

大部分我不关心的文本,我只想保持原样 打开paren意味着打开一个新的层次;匹配结束参数意味着完成该级别 可以在同一级别使用多个括号,并用逗号分隔,尽管我并不真正关心这一点 可以有多个相邻的左括号和右括号 在第一个段落之前和最后一个段落之后可能有文本,也可能没有文本 我尝试了很多不同的语法,从Antlr 4参考书中的ArrayInit示例开始

这是一次失败的尝试:

grammar NestedParens ;
init: STR* ( '(' value (value)* ')' )* STR* ;
value: init
     | STR
     ;
STR: [^()]+ ;
ANTLR给出的错误为:

error153: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: [^()]+ ;

你的尝试怎么会失败?您能否提供示例输入和相应的输出?括号是否总是表示级别的开始/结束,注释或字符串文本中没有括号?如果没有字符串文字和注释,然后,我就不用麻烦使用解析器生成器,只需编写几行代码跟踪级别,并在需要时发出一些缩进。@BartKiers该示例语法不被接受,并表示error153:NestedParens.g4:5:0:rule init包含一个闭包,其中至少有一个选项可以匹配空字符串行号可能与我发布的内容不符,因为它不接受它,没有可供尝试的输入。将在单独的注释中回答您的另一个问题。@BartKiers是的,打开的父级总是表示一个新级别,关闭的父级总是将其关闭。要明确的是,我并不附属于我发布的示例代码,我正在寻找任何可以工作的代码。但在过去,如果你不在堆栈上发布一个示例,人们会要求它。事实上,我可能有六次完全错误的尝试,没有看到发布它们的意义,只是更多的噪音。不,我是指一些示例输入,您正试图用相应的漂亮打印输出进行解析。但是,由于您的语言非常简单,所以我根本不需要解析器生成器。