是否有任何工具可以将 ANTLR 语法语法与其他 BNF 语法转换?有几种带有规范的 Backus-Naur 形式(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 语法中,转换可能再次变得棘手。
有一个网站托管了大量的语法和工具来在它们的格式之间进行转换: