是否有工具可以在ANTLR和其他形式的BNF之间进行转换?

Jak*_*kob 10 antlr bnf context-free-grammar

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

Tra*_*vis 6

# 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`
Run Code Online (Sandbox Code Playgroud)


Bar*_*ers 5

雅各布写道:

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

ANTLR (v3) 是“用它自己的话”(正如特伦斯·帕尔本人所说)用以下语法编写的:

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


雅各布写道:

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

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

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

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


And*_*een 5

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

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