3

是否有一个 EBNF 铁路生成器可以创建更大的块,而不是每个语法生成一个图表?

我已经尝试过http://bottlecaps.de/rr/ui并且非常好:可以从 W3C 规范中抓取 EBNF 语法(例如http://www.w3.org/TR/sparql11-query/),生成一个带有嵌入 SVG 的单个 XHTML 或带有许多 PNG 的 zip 交叉链接定义和用法。

但是,SPARQL 1.1 语法有 173 个产生式。当每个产品都有一张图表时,很难理解。我正在寻找类似这样的块:http: //ontologicalengineering.blogspot.com/2008/12/sparql-railroad-diagram-from-hell.html

4

1 回答 1

0

我也遇到了这个问题。我最终编写了一个快速而肮脏的 vim 脚本,将我的整个语法压缩到一个产品中。

较少粒度的铁路图的问题在于,它们丢失了一些由较细粒度的铁路图赋予它们的标签。

对于 EBNF 的任何常规(IE:无递归)子集,您只需将左侧“查找并替换”为右侧,直到它处于所需的形式。例如我压缩:

Identifier ::= Letter AlphaNum*
Letter ::= [a-zA-Z]|[_]
NonZeroDigit ::= [1-9]
Digit ::= NonZeroDigit | [0]
AlphaNum ::= Letter|Digit

进入:

Identifier ::= ([a-zA-Z]|[_]) (([a-zA-Z]|[_])|(([1-9])|[0]))*

达到了预期的效果。

过程:

  1. 查找仅包含终端的规则(例如:)Letter ::= [a-zA-Z]|[_]编辑:如果找不到任何规则,只需选择任何规则,它仍然有效,但会导致过程稍微混乱
  2. 将所有出现的左侧替换为用括号括起来的右侧。
  3. 重复直到达到所需的粒度。

希望这可以帮助!

于 2014-11-05T04:36:14.007 回答