将面向命令的定义转换为面向结构的定义

时间:2017-09-09 10:39:57

标签: json xml parsing grammar

说我有一个应用程序,它通过在命令行上执行各种命令来配置(我的应用程序是FRR路由套件,但问题是一般的)。我列出了所有可能命令的所有可能排列(frr应用程序有一个debug命令,它打印出所有可能命令的排列)。该列表如下所示:

`
  bgp bestpath med confed
  bgp bestpath med missing-as-worst confed
  bgp bestpath med missing-as-worst
  bgp log-neighbor-changes
  bgp default ipv4-unicast
  bgp default local-preference (0-4294967295)
  bgp default show-hostname
  bgp default subgroup-pkt-queue-max (20-100)
  bgp network import-check
  bgp route-reflector allow-outbound-policy
  bgp listen limit (1-5000)
  bgp listen range A.B.C.D/M peer-group WORD
  bgp listen range X:X::X:X/M peer-group WORD
  bgp dampening (1-45) (1-20000) (1-20000) (1-255)
  bgp dampening (1-45)
  bgp dampening
  update-delay (0-3600)
  update-delay (0-3600) (1-3600)
  write-quanta (1-10000)
  coalesce-time (0-4294967295)
  timers bgp (0-65535) (0-65535)
  neighbor A.B.C.D remote-as (1-4294967295)
  neighbor A.B.C.D remote-as internal
  neighbor A.B.C.D remote-as external
  neighbor A.B.C.D local-as (1-4294967295)
  neighbor A.B.C.D local-as (1-4294967295) no-prepend
  neighbor A.B.C.D local-as (1-4294967295) no-prepend replace-as
  neighbor A.B.C.D solo
  neighbor A.B.C.D password LINE
  neighbor A.B.C.D peer-group WORD
  neighbor A.B.C.D passive
  neighbor A.B.C.D shutdown
  neighbor A.B.C.D shutdown message MSG...
  neighbor A.B.C.D shutdown message MSG
`

实际列表要长得多,但正如您所看到的那样,命令包含"文字关键字"例如" bgp"或" bestpath"它包含变量(通常用大写字母表示,例如" A.B.C.D / M") - 变量实际上意味着可以有一个命名元素列表(例如邻居列表)。

所以基本上这个命令列表给了我一个配置模式,我可以用它来验证给定的配置是否有效。现在我想将这个面向命令的定义转换为结构化定义(XML或JSON)。

我想请某人指出我正确的方向如何处理这个问题 - 实际上我宁愿使用一些现有工具而不是黑客攻击我自己的解析器。

0 个答案:

没有答案