有人知道有什么工具可以转换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中,您需要一个外部的.*? '*/'
部分扫描器