如何将antlr4语法文件转换为tree-sitter语法文件?

问题描述 投票:0回答:1

有谁知道可以将 ANTLR v4 语法文件(.g4 扩展名)转换为 tree-sitter 语法文件(.js 扩展名)的任何工具?如果我必须将几个转换工具链接在一起也很好。例如,从

foo.g4
(antlr4)到
foo.ebnf
(中间格式)再到
foo.js
(树保姆)。谢谢!

我试过使用这个工具从g4到ebnf,然后这个工具从ebnf到tree-sitter js,但无济于事。第一个工具似乎在文件底部创建了一些垃圾,这给第二个工具带来了麻烦。此外,第二个工具似乎期望每个定义都完全在一行上(并且第一个工具将每个定义分成多行以便于阅读)。

parsing antlr4 grammar converters treesitter
1个回答
0
投票

此任务需要一个转译器,也称为源到源编译器。这种转译器的早期版本是我的lezer-parser-import(lezer-parser 和 tree-sitter 非常相似)

转译基本语法是微不足道的......

挑战:

  • 通过为标记添加优先级来解决解析冲突。 lezer-parser 也有 歧义标记(tree-sitter 应该有类似的东西,因为它也是一个 GLR 解析器)。解决方案概念:生成简短的有效源文本(模糊测试、反解析、ref 1ref 2ref 3),比较解析树(treediff),添加标记以匹配 ANTLR 解析树
  • 翻译否定。在 ANTLR 中,您可以用感叹号前缀否定标记:
    !some_token
    。这在 tree-sitter 或 lezer-parser 中不起作用,因此您可能需要为外部扫描器生成代码(tree-sitter 的 C 代码,lezer-parser 的 JavaScript 代码)
  • 翻译正则表达式标记。在 ANTLR 中,你可以用
    BlockComment: '/*' .*? '*/' -> skip;
    来词法块注释。在 tree-sitter 和 lezer-parser 中,
    .*? '*/'
    部分需要一个外部扫描仪
© www.soinside.com 2019 - 2024. All rights reserved.