更大粒度的铁路图生成器?

问题描述 投票:0回答:2

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

我已经尝试过 https://www.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

ebnf
2个回答
0
投票

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

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

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

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. 重复直到达到所需的粒度。

希望这有帮助!


0
投票

也许这个 Python Syntrax 可以帮助您获得更大、更长的铁路图。

https://kevinpt.github.io/syntrax/

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.