ANTLR Parser对标记语言的建议

时间:2016-07-06 04:49:31

标签: parsing antlr

我们使用的当前加价在以下部分中进行了说明。它主要是由于灵活性而创建的,但我们并不介意改变它。

在我能给出的最简单的例子中,这里有一些标记:

interface Serial0/0/0:1
description <<! variable, data_t1_port_size, Data T1 Port Size in kbps !>> kbps MPLS; <<!variable, data_t1_carrier_name, Data T1 Carrier Name !>>; Ckt <<! variable, data_t1_carrier_circuit_id, Data T1 Carrier Circuit ID !>>
bandwidth <<! variable, data_t1_port_size, Data T1 Port Size in kbps !>> 

标记语言的简要注释:

interface Serial0/0/0:1 (inline static config)
description <<! variable, [variableValue], [variableDescription] !>> kbps MPLS; <<!variable, [variableValue], [variableDescription] !>>; Ckt <<! variable, [variableValue], [variableDescription] !>>
bandwidth <<! variable, [variableValue], [variableDescription] !>> 

这是路由器配置 用户可以通过填写Web GUI中的值来输入variableValue (显示变量描述的标签将显示,以便他们知道什么 他们正在进入。)

最终目标是解析内联变量并且是 能够生成这样的东西:

interface Serial0/0/0:1
description 1544 kbps MPLS; Verizon; Ckt 123456789
bandwidth 1544 

我的问题是: 是否有可用于执行此操作的常用标记语言(我们始终可以更改模板)?

要求是:

  • 可以包含变量值和变量的内联变量 描述
  • 对于语言中的每种逻辑类型(此处未演示, 但能够多次重复一行配置会很好。

1 个答案:

答案 0 :(得分:0)

我认为在这种情况下你可能会发现ANTLR过于严格。它对编程语言很方便,而不是模糊的文本&#34;。

还有很多工作要做。您必须决定是否在Lexer中进行此操作(即,您以某种方式使其对上下文敏感),Parser或在后期处理期间。

例如,如果您决定&#34; interface&#34;将是您语法中的保留关键字,然后您不得使用单词&#34; interface&#34;在描述部分。 这可能会让用户感到困惑。但另一方面,Lexer和Parser很容易实现。 (当你强制描述为双引号时,这个问题会消失)。

所以我认为ANTLR会在第一阶段帮助你。当您在项目中进行多次迭代并且必须多次重构解析器时,ANTLR非常方便。

但另一方面,一些角落案例可能很难理清。

也许最好的方法是如何开始为解析器准备(收集)更大的代表性输入。

然后你应该决定Lexer是否只识别特殊标签(&#34;&lt;&gt;&#34;)或者它是否也支持关键字。执行带引号的字符串会使解析变得更容易,但我不知道用户会对它感到满意。

PS:你也可以例如强制变量名以#34; $&#34;开头。 (或&#34; @&#34;)在Lexing期间将它们与其他任何东西区分开来。