2013-04-02 2 views
3

Есть ли генератор железной дороги EBNF, который может создавать большие куски, а не одну диаграмму для производства грамматики?Большая зернистость Генератор диаграммы железной дороги?

Я попытался http://bottlecaps.de/rr/ui и это довольно хорошо: может царапать EBNF грамматик из W3C спецификации (например, http://www.w3.org/TR/sparql11-query/), генерирует либо один XHTML с вставленным SVG или почтовый индекс со многим в формате PNG, перекрестные ссылками определений и использования.

Однако грамматика SPARQL 1.1 имеет 173 произведения. Это очень сложно понять, когда у вас есть одна диаграмма для каждой продукции. Я ищу что-то такое, как этот: http://ontologicalengineering.blogspot.com/2008/12/sparql-railroad-diagram-from-hell.html

ответ

0

Я столкнулся с этой проблемой. Я закончил тем, что написал быстрый и грязный сценарий vim, чтобы сжать всю мою грамматику в единое производство.

Проблема с менее гранулированными диаграммами железных дорог заключается в том, что они теряют некоторые маркировки, данные им более гранулированными.

Для любого регулярного (IE: sans recursion) подмножества 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]|[_]) EDIT: Если вы не можете найти, просто выбрать любое правило, она по-прежнему работает, но приводит к немного грязнее процессу
  2. Заменить все вхождения левой стороны правой стороны, заключенной в скобки.
  3. Повторяйте до достижения желаемой степени детализации.

Надеюсь, это поможет!