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



有人知道有什么工具可以转换ANTLR v4语法文件吗?G4扩展名)到树保姆语法文件(.js扩展名)?如果我必须将几个转换工具链接在一起,这也会很好。例如,从foo.g4(antlr4)到foo.ebnf(中间格式)再到foo.js(tree-sitter)。谢谢你!

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

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

翻译基本语法是微不足道的…

挑战:

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

最新更新