Railroad diagram(Syntax diagram) の記述

Snow Flower Text ではAsciiDoc の拡張として Railroad 図 の作図をサポートしています。 Railroad 図は、正規表現やBNFを使用するよりも読みやすい形式で文法を視覚的に表現する方法です。 文脈自由文法を簡単に表現できます。簡潔で分かりやすい構文のプレーンテキスト形式で Railroad diagram の表現ができます。

Railroad diagram の作図は Snow Flower Text 独自の AsciiDoc の拡張機能です。このHTML 文書自体も Snow Flower Text を使用して作成しています。 Railroad 図はベクター画像で生成されますので、どのようなサイズの媒体でもジャギーのない鮮明な図となります。

構文の詳細は 「Railroad diagram 構文」 を参照してください。

使い方

AsciiDoc の [railroad] ブロックに Railroad Diagram 構文のテキストを記述することで、 Railroad図を文書に埋め込む事ができます。

[railroad]
-----------
Diagram(
Optional('+', 'skip'),
Choice(0,
NonTerminal('name-start char'),
NonTerminal('escape')),
ZeroOrMore(
Choice(0,
NonTerminal('name char'),
NonTerminal('escape'))))
-----------

これは次のように表示されます。

Railroad の簡単な例
対話機能の有効化

Railroad Diagram はハイパーリンクやテキスト選択をサポートしていますが、 Snow Flower Text ではデフォルトで無効になっています。 対話動作を有効にするには、次のようにrailroad ブロックで inline=true を指定する必要があります。

[railroad, inline=true]

対話機能は表示時に必要なメモリーリソースが増加するので必要な場合のみ有効にすることを推奨します。

Railroad diagram 構文

Children
Child

Leaves

Terminal(text, href?)

リテラルテキストを表します。 href パラメタはハイパーリンクを指定します。

NonTerminal(text, href?)

命令または他のプロダクションを表します。 href パラメタはハイパーリンクを指定します。

Comment(text, href?)

コメント。href パラメタはハイパーリンクを指定します。

Start(type?, label?)

開始。これはデフォルトで提供されていますが、ダイアグラムにラベルを付けたい場合に明示的に作成することができます。 type パラメタは、’simple'(デフォルト) または’complex’のいずれかを指定します。

End(type?)

終了。

href

次はハイパーリンクが動作する単純な例です。 railroad ブロックで inline=true を設定して対話機能を有効にしています。

[railroad, inline=true]
----------
Diagram(
Terminal('yosbits', {href:'/wordpress', title:'yosbits'})
)
----------

Containers

Sequence(children)

正規表現内の単純な連結と同様です。

[railroad]
----------
Diagram(
Sequence('1', '2', '3')
)
----------

これは次のように表示されます。

Sequence(‘1’, ‘2’, ‘3’)
Choice(index, children)

正規表現の’|’と同様です。 index引数は中央に配置するChildのインデックスを指定します。

[railroad]
----------
Diagram(
Choice(1, '1', '2', '3')
)
----------

これは次のように表示されます。

Choice(1, ‘1’, ‘2’, ‘3’)
Optional(child, skip?)

正規表現の`?`と同様です。skipパラメータに “skip”を指定すると、スキップが中央になります。

[railroad]
----------
Diagram(
Optional('foo'), Optional('bar', 'skip')
)
----------

これは次のように表示されます。

Optional(‘foo’), Optional(‘bar’, ‘skip’)
OneOrMore(child, repeat?)

正規表現の+と同様です。 repeat引数は繰り返しの間に入るべきものを指定します。

[railroad]
----------
Diagram(
OneOrMore('foo', Comment('bar'))
)
----------

これは次のように表示されます。

OneOrMore(‘foo’, Comment(‘bar’))
ZeroOrMore(child, repeat?, skip?)

正規表現の * と同様です。 skip パラメータは Optional と同じです。

[railroad]
----------
Diagram(
ZeroOrMore('foo', Comment('bar'))
)
----------

これは次のように表示されます。

ZeroOrMore(‘foo’, Comment(‘bar’))
Stack

Sequence と同じですが、項目は水平方向ではなく垂直方向にスタックします。

[railroad]
----------
Diagram(
Stack('1', '2', '3')
)
----------

これは次のように表示されます。

Stack(‘1’, ‘2’, ‘3’)
OptionalSequence(children)

少なくとも1つのアイテムを選択しなければならないシーケンスです。

[railroad]
----------
Diagram(
OptionalSequence('1', '2', '3')
)
----------

これは次のように表示されます。

OptionalSequence(‘1’, ‘2’, ‘3’)
MultipleChoice(index、type、children)

これは Choice に似ていますが、 これは複数の分岐を表現します。type引数は ‘any’(OR条件)または’all’(AND条件)を指定します。

[railroad]
----------
Diagram(
MultipleChoice(1, 'all', '1', '2', '3')
)
----------

これは次のように表示されます。

MultipleChoice(1, ‘all’, ‘1’, ‘2’, ‘3’)
[railroad]
----------
Diagram(
MultipleChoice(1, 'any', '1', '2', '3')
)
----------

これは次のように表示されます。

MultipleChoice(1, ‘any’, ‘1’, ‘2’, ‘3’)
HorizontalChoice(children)

Choice と同じですが、項目は縦ではなく横に積み上げられます。

[railroad]
----------
Diagram(
HorizontalChoice(Choice(0,'1','2','3','4'), '4', Choice(3, '1', '2', '3', '4'))
)
----------

これは次のように表示されます。

HorizontalChoice(Choice(0,’1′,’2′,’3′,’4′), ‘4’, Choice(3, ‘1’, ‘2’, ‘3’, ‘4’))

参考

Download on the Mac App Store