ANTLR解析器对标记语言的建议
问题描述:
我们使用的当前标记在下面的部分中进行了演示。它主要是由于灵活性而创建的,但我们不介意改变它。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
我的问题是: 是否有可能在为了做到这一点可以使用的通用标记语言(我们可以随时更改模板)?
的要求将是:
- 内嵌变量,其可以包括一个可变值和可变 描述
- 对于-每个语言(在此未显示出内类型的逻辑, 但是这将是很好能够重复一次配置的次数)。
答
我想你可能会发现ANTLR在这种情况下限制太多。对于编程语言而言,这很方便,而不是“不明确的文本”。
很多工作都需要完成。您必须决定这是否会在Lexer中完成(即,您是否以某种方式对上下文敏感),Parser或后期处理过程中。
例如,如果您决定“接口”将成为语法中的保留关键字,则不得使用在描述部分中使用“接口”一词。 这可能会让用户感到困惑。但另一方面,Lexer和Parser会很容易实现。 (当你强制描述符被双引号时,这个问题的源头会消失)。
所以我觉得ANTLR会在第一阶段帮助你很多。当你在你的项目中进行多次迭代时,ANTLR非常方便,你必须多次重构解析器。
但另一方面,一些角落案例可能很难理清。
也许最好的方法是如何开始为分析器准备(收集)一组更大的代表性输入。
然后,您应该决定Lexer是否只识别特殊标签(“<>”)或者它是否也支持关键字。强制引用字符串会使解析更容易,但我不知道用户会对此感到满意。PS:您也可以例如强制变量名以“$”(或“@”)开头,以便在Lexing期间将其与其他任何内容区分开来。