【发布时间】:2014-11-17 17:11:19
【问题描述】:
场景:
- 我收到了一种神秘的语言,其语法显然非常深奥
- 巨大的 10k 混乱,在一行中,代表 1 条神秘语言的陈述
- 假设我最初并不关心深层语法
- 我要做的就是根据嵌套括号重新格式化它
我的简化语言规则:
- 大部分文字我不关心,我只想保持原样
- 打开paren意味着打开一个新的水平;匹配结束括号意味着完成该级别
- 可以在同一级别有多个括号,用逗号分隔,但我并不关心这一点
- 可以有多个相邻的左括号和右括号
- 第一个括号之前和最后一个括号之后可能有也可能没有文本
我尝试了很多不同的语法,从 Antlr 4 Reference book 中的 ArrayInit 示例开始。
这是一次失败的尝试:
grammar NestedParens ;
init: STR* ( '(' value (value)* ')' )* STR* ;
value: init
| STR
;
STR: [^()]+ ;
ANTLR 给出的错误:
“错误(153):NestedParens.g4:5:0:规则初始化包含一个闭包,其中至少有一个可以匹配空字符串的替代方案”
(行号可能与我发布的内容不同)
一些想法:
- 我认为有效的零长度字符串是一个问题,但不确定如何解决它们
- 也许我认为始终是自上而下的 Antlr 不是解决此问题的正确工具吗?
- 也许有一个更简单的工具可以让您只指定您关心匹配括号、大括号、方括号等?
【问题讨论】:
-
您的尝试是如何失败的?您能否提供具有相应输出的示例输入?括号是否总是表示级别的开始/结束,在 cmets 或字符串文字中没有括号?如果没有字符串文字和 cmets,那么我就不会使用解析器生成器,而只需编写几行代码来跟踪级别并在需要时发出一些缩进。
-
@BartKiers 示例语法不被接受并说“错误(153):NestedParens.g4:5:0:规则初始化包含一个闭包,其中至少有一个可以匹配空字符串的替代方案” (行号可能与我发布的内容不同)由于它不接受它,因此没有输入可尝试。将在单独的评论中回答您的其他问题。
-
@BartKiers 是的,打开的父级总是表示一个新级别,而关闭的父级总是关闭它。
-
明确地说,我没有附加到我发布的示例代码,我正在寻找任何可行的方法。但是在过去,如果您不在堆栈上发布示例,人们会要求它。实际上,我可能有六次完全错误的尝试,没有看到发布它们的意义,只是更多的噪音。
-
不,我的意思是您尝试使用相应的漂亮打印输出解析一些示例输入。但是,由于您的语言是如此简单,所以我根本不会费心使用解析器生成器。
标签: regex antlr4 pretty-print parentheses