我正在使用ANTLR语法为Visual Studio开发语言服务。但是,语法中填充了C ++代码来处理预处理程序指令以及编译器的效率原因。
Visual Studio的语言服务很难用C ++编写,所以我需要一个C#解析器来使用相同的语言。这意味着我必须设置language=CSharp2
并从语法中删除所有C ++代码。
我正在考虑编写一个从语法中删除所有C ++代码的导出器,并将简单语句转换为{ $channel = HIDDEN; }
到{ $channel = TokenChannels.Hidden; }
。
有更聪明的方法吗?比如通过模板,或者在语法中嵌入两种语言的小技巧?
答案 0 :(得分:0)
我使用AST将问题分解为两个阶段。让您的解析器使用目标语言中性语法(生成AST)并使用Antlr工具的-target选项以您选择的目标语言(C ++,C#,Java等)生成解析器。
然后使用您的操作以目标语言实现AST walker。这样做的好处是,一旦你完成一个AST walker,你可以复制它,只需更改另一个目标语言的动作。