【问题标题】:ANTLR Parser suggestions for markup languageANTLR Parser 对标记语言的建议
【发布时间】:2016-07-06 18:58:45
【问题描述】:

我们使用的当前标记在以下部分中进行了演示。它主要是出于灵活性而创建的,但我们不介意对其进行更改。

在我能给出的最简单的例子中,以下是一些标记:

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 (将显示一个显示 variableDescription 的标签,以便他们知道 他们正在进入)。

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

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

我的问题是: 是否有可以使用的通用标记语言来执行此操作(我们总是可以更改模板)?

要求是:

  • 可以包含变量值和变量的内联变量 说明
  • 对于语言中的每种类型的逻辑(此处未演示, 但如果能够多次重复一行配置,那就太好了)。

【问题讨论】:

    标签: parsing antlr


    【解决方案1】:

    我认为在这种情况下您可能会发现 ANTLR 过于严格。它对于编程语言而不是“模糊文本”很方便。

    需要做很多工作。您必须决定这是否将在 Lexer(即您使其以某种方式对上下文敏感)、Parser 或在后期处理期间完成。

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

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

    但另一方面,一些极端情况可能难以解决。

    也许是最好的方式来启动它来为解析器准备(收集)一组更大的代表性输入。

    然后你应该决定 Lexer 是只识别特殊标签(“”)还是它也支持关键字。强制使用带引号的字符串会使解析更容易,但我不知道我的用户会不会满意。

    PS:例如,您还可以强制变量名称以“$”(或“@”)开头,以便在 Lexing 期间将它们与其他任何内容区分开来。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多