2016-07-06 70 views
0

我们使用的当前标记在下面的部分中进行了演示。它主要是由于灵活性而创建的,但我们不介意改变它。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中的值来输入变量值( (显示变量的标签将会显示,以便他们知道他们正在输入什么 )。

的最终目标是解析内联变量,并 能够产生这样的:

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

我的问题是: 是否有可能在为了做到这一点可以使用的通用标记语言(我们可以随时更改模板)?

的要求将是:

  • 内嵌变量,其可以包括一个可变值和可变 描述
  • 对于-每个语言​​(在此未显示出内类型的逻辑, 但是这将是很好能够重复一次配置的次数)。

回答

0

我想你可能会发现ANTLR在这种情况下限制太多。对于编程语言而言,这很方便,而不是“不明确的文本”。

很多工作都需要完成。您必须决定这是否会在Lexer中完成(即,您是否以某种方式对上下文敏感),Parser或后期处理过程中。

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

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

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

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

然后,您应该决定Lexer是否只识别特殊标签(“<>”)或者它是否也支持关键字。强制引用字符串会使解析更容易,但我不知道用户会对此感到满意。PS:您也可以例如强制变量名以“$”(或“@”)开头,以便在Lexing期间将其与其他任何内容区分开来。