ANTLR文法構文を他のBNF構文との間で変換するためのツールはありますか?バッカス・ナウア記法(BNF、EBNF、ABNF、W3C-BNF、XBNF ...)には、仕様のあるいくつかの形式があります。たとえば、このリストを参照してください。ANTLR文法構文は、例によってのみ説明されているようです。ANTLR文法ファイルには文脈自由構文の仕様以上のものが含まれていることは知っていますが、少なくとも共通のサブセットを変換できるはずです-誰かがまだ自動的に行ったことがありますか?
4 に答える
# 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`
私はこの目的のために翻訳者を書きました。Universal-transpilerは、ANTLR文法をPEG.js、nearley、ABNF、XBNF、およびその他のいくつかの文法表記に変換できます。ANTLRをW3C-BNFに変換することはまだできませんが、将来のバージョンでこの機能を追加しようとしています。
このトランスレータは、ANTLR言語の小さなサブセットとのみ互換性がありますが、それでも役立つことを願っています。
ヤコブは書いた:
ANTLR文法構文は、例によってのみ説明されているようです。
ANTLR(v3)は、この文法で「独自の言葉で」(Terence Parr自身が言ったように)書かれています。
http://www.antlr.org/grammar/ANTLR/ANTLRv3.g
ヤコブは書いた:
しかし、少なくとも共通のサブセットを変換できるはずです-誰かがまだ自動的に行ったことがありますか?
私が知っていることではありません。そして、それが存在する場合、私が定期的に読んでいるANTLRメーリングリストでこのツールが議論されているのを見たことがありません。
また、多くのBNFバリアントでは、左再帰ルールが許可されています。これは、ANTLRのようなLLパーサジェネレータでは対応できません。左再帰ルールはもちろんツールによってリファクタリングできますが、それはかなりトリッキーであり、手動で行うよりもはるかに「読みやすい」文法になる可能性があります。
ANTLR文法をBNFのような形式に変換することに関しては、最も些細な文法でのみですが、私は推測するのが簡単でしょう。さまざまなタイプの述語がANTLR文法に組み込まれるとすぐに、変換が再びトリッキーになる可能性があります。
フォーマット間で変換するための多種多様な文法とツールをホストするサイトがあります。