11

是否有任何工具可以将 ANTLR 语法语法与其他 BNF 语法转换?有几种带有规范的 Backus-Naur 形式(BNF、EBNF、ABNF、W3C-BNF、XBNF...),例如,请参阅此列表。ANTLR 语法似乎只通过示例来描述。我知道 ANTLR 语法文件包含的不仅仅是上下文无关语法的规范,但您至少应该能够转换公共子集 - 有人自动完成了吗?

4

4 回答 4

10
# 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`
于 2012-04-24T17:20:59.773 回答
5

为此,我写了一个翻译器。Universal-transpiler能够将 ANTLR 语法转换为PEG.jsnearleyABNFXBNF和其他几种语法符号。它还不能将 ANTLR 翻译成 W3C-BNF,但我会尝试在未来的版本中添加这个功能。

这个翻译器只兼容一小部分 ANTLR 语言,但我希望它仍然有用。

于 2019-01-03T10:08:20.513 回答
4

雅各布写道:

ANTLR 语法语法似乎仅通过示例来描述。

ANTLR (v3) 是“用它自己的话”(正如 Terence Parr 自己所说的那样)写在这个语法中:

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


雅各布写道:

但是您至少应该能够转换公共子集-有人自动完成了吗?

从来没听说过。如果它确实存在,我从来没有在我定期阅读的 ANTLR 邮件列表上看到这个工具被讨论过。

另请注意,许多 BNF 变体允许左递归规则,这是 ANTLR 之类的 LL 解析器生成器无法处理的。左递归规则当然可以由该工具重新分解,但这可能相当棘手,并且可能会导致比手动执行此操作所获得的“可读”语法要少得多。

至于将 ANTLR 语法转换为类似 BNF 的形式,我猜会更容易,尽管只有最简单的语法。一旦将各种类型的谓词放入 ANTLR 语法中,转换可能再次变得棘手。

于 2011-02-02T08:37:57.967 回答
2

有一个网站托管了大量的语法和工具来在它们的格式之间进行转换:

http://slebok.github.io/zoo/index.html

于 2019-01-04T20:20:44.870 回答