尝试"simple"解析 w/ antlr4 以重新格式化/漂亮打印



场景:

  • 我收到一种神秘的语言,语法显然非常深刻
    • 巨大的 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: [^()]+ ;

最新更新