2011-02-01 13 views
8

ANTLR文法構文と他のBNF構文を変換するツールはありますか?特定のバックナス - ナウアフォーム(BNF、EBNF、ABNF、W3C-BNF、XBNF ...)がいくつかあります。 see this list。 ANTLR文法構文はdescribed by examplesのように見えます。 ANTLR文法ファイルには文脈自由構文の仕様以上のものが含まれていますが、少なくとも共通部分集合を変換できるはずです。ANTLRと他の形式のBNFを変換するツールはありますか?

答えて

2

は、ヤコブは書きました:

ANTLR文法構文は単なる例で説明しているようです。

ANTLR(V3)がこの文法で(テレンス・パー自身がそれを置くよう) "独自の言葉で" 書き込み:

http://www.antlr.org/grammar/ANTLR/ANTLRv3.g


ヤコブは書きました:

しかし、あなたは少なくともc ommonサブセット - 誰でもまだ自動的に完了していますか?

これはわかりません。存在していれば、私はこのツールが定期的に読んだANTLRメーリングリストで議論されることはありませんでした。

多くのBNF-variantでは、left-recursiveのルールが許されています.ANTLRのようなLL-パーサ生成器では対応できないルールです。もちろん、左の再帰的なルールはツールで再計算することができますが、それはややこしいかもしれません。手動で行うよりもはるかに「読みやすい」文法になるでしょう。

ANTLR文法をBNFのような形式に変換することは、最も単純な文法では簡単ですが、私は推測しやすいでしょう。さまざまな種類の述語がANTLR文法に入れられるとすぐに、変換がやりにくくなる可能性があります。

+0

ありがとう、ANTLRで書かれたANTLR文法は、私が探していたものでした。 ANTLRを理解する限り、左回帰文法を書き留めることはできますが、手動でそれらをリファクタリングする必要があります。他のBNF形式とANTLRからのコンバータは、BNF構文バリエーションの点数やその他のマイナーな側面の違いを手動で取り入れる必要性を、少なくとも軽減するでしょう。 – Jakob

+0

ESC: '\\'(... | 'u' XDIGIT XDIGIT XDIGIT XDIGIT)は、\ uFFFFを超えるコードポイントと一致することはできません。 – Jakob

+0

@Jakob、正しく、サポートされている範囲は '\ u0000'..' \ uFFFF'です。 –

5
# Grammar Syntax 

|        | BNF       | ISO EBNF      | ABNF       | ANTLR       | 
|:-----------------------------:|:-----------------------------:|:-----------------------------:|:-----------------------------:|:-----------------------------:| 
| rule definition    | `<name> ::= ...`    | `name = ... ;`    | `name = ...`     | `name : ... ;`    | 
| terminal items    | `...`       | `'...'` or `"..."`   | integer or `"..."`   | `'...'`      | 
| non-terminal items   | `<...>`      | `...`       | `...` or `<...>`    | `...`       | 
| concatenation     | (space)      | `,`       | (space)      | (space)      | 
| choice      | `|`       | `|`       | `/`       | `|`       | 
| optional      | requires choice syntax[^1] | `[...]`      | `*1...` or `[...]`   | `...?`      | 
| 0 or more repititions   | requires choice syntax[^2] | `{...}`      | `*...`      | `...*`      | 
| 1 or more repititions   | requires choice syntax[^3] | `{...}-`      | `1*...`      | `...+`      | 
| n repititions     |        | `n*...`      | `n*n...`      |        | 
| n to m repititions   |        |        | `n*m...`      |        | 
| grouping      |        | `(...)`      | `(...)`      | `(...)`      | 
| comment      |        | `(*...*)`      | `;...`      | `// ...` or `/* ... */`  | 


[^1]: `optionalb ::= a b c d | a c d` 

[^2]: `list ::= | listitem list` 

[^3]: `list ::= listitem | listitem list` 
+0

私が間違っている場合は私を修正してください。私はこれに新しいです。^_^b – Travis

+0

はい、単純な文法では、異なる構文間でマッピングすることができます。私はこの変換を行うツール(BNF、ISO EBNF、ABNF、ANTLR ...)を探していました。確かにあなた自身のツールを作成することは可能です;-) – Jakob

関連する問題