【问题标题】:Trying "simple" parsing w/ antlr4 to reformat / pretty-print尝试使用 antlr4 进行“简单”解析以重新格式化/漂亮打印
【发布时间】: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


【解决方案1】:

试试这个语法:

grammar NestedParens ;
init: STR* ( '(' value (value)* ')' ) STR* ;
value: init
     | STR
     ;
STR: [^()]+ ;

不同之处在于缺少一个*,这使得在您的版本中匹配init 的空字符串(antlr 编译器抱怨的错误)不再匹配。

这也可以:

grammar NestedParens ;
init: STR* ( '(' value (value)* ')' )+ STR* ;
value: init
     | STR
     ;
STR: [^()]+ ;

【讨论】:

    猜你喜欢
    • 2018-10-08
    • 2011-01-07
    • 2011-06-24
    • 2016-02-25
    • 2020-03-31
    • 1970-01-01
    • 2011-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多