Parsing 从yacc解析器获取clang/llvm解析器

Parsing 从yacc解析器获取clang/llvm解析器,parsing,clang,llvm,yacc,promela,Parsing,Clang,Llvm,Yacc,Promela,我正在尝试在llvm中为Promela构建一个解析器。我有SPIN使用的解析器,它是使用yacc构建的,包括到yacc的输入。有没有一种方法可以使用yacc解析器快速、轻松地生成clang/llvm解析器?我将使用它生成调用图并执行静态分析 我现在需要知道的是,我是否可以使用现有的Promela编译器(它是用yacc构建的)使用llvm框架快速构建解析器(以及后来的IR生成器) 是的,您可以在项目中重复使用现有的YACC语法(如果您甚至想要现有的AST)。“使用llvm框架构建解析器”有点误导,

我正在尝试在llvm中为Promela构建一个解析器。我有SPIN使用的解析器,它是使用yacc构建的,包括到yacc的输入。有没有一种方法可以使用yacc解析器快速、轻松地生成clang/llvm解析器?我将使用它生成调用图并执行静态分析

我现在需要知道的是,我是否可以使用现有的Promela编译器(它是用yacc构建的)使用llvm框架快速构建解析器(以及后来的IR生成器)

是的,您可以在项目中重复使用现有的YACC语法(如果您甚至想要现有的AST)。“使用llvm框架构建解析器”有点误导,因为llvm与解析和AST无关。在生成LLVM IR并使用它之前,LLVM不会进入它

因此,您要么采用现有的YACC语法和现有的AST,要么只采用语法并将操作替换为创建您自己定义的AST的操作。无论哪种方式,该部分都不会涉及LLVM


然后编写一个单独的阶段,遍历AST并使用LLVM API生成LLVM IR,然后在该阶段上运行LLVM支持的所有转换和分析。

什么是“clang/LLVM解析器”?创建LLVM位码作为其输出的解析器?生成AST然后转换为LLVM位码的程序?当然你能做到,这不是一件不寻常的事。不过,叮当声与此无关。如果您想生成一个叮当作响的AST,答案是“有点,但这不是个好主意”。Clang AST是专门为C族语言设计的,您无法在其中轻松地表示其他语言。因此,为非C语言创建一个Clang AST意味着将其翻译为C。另外,调用图不需要Clang,只需要LLVM。我希望找到一种方法,使用现有的yacc解析器以最小的工作量构建一个Clang解析器(因此也是AST)“Clang解析器”这个术语仍然让我感到困惑。你能澄清一下你的意思吗?在我的世界里有CLAN解析器,它把C、C++和Objo C解析成C族特定的AST,然后转换成LLVM位代码。那么,当你说你想构建“一个clang解析器”时,你的意思是想让你的解析器生成与clang解析器相同的AST(我认为这是一个坏主意,正如我在前面的评论中所解释的)还是别的什么?我认为clang+llvm是一个完整的框架,并且没有正确地意识到它们的区别/边界,谢谢你指出这一点。我的目标是在Promela上执行静态分析,首先生成AST。我想在LLVM上做这件事,因为有大量可用的分析工具。正如您所解释的,在这个过程中,似乎clang没有位置。我现在需要知道的是,我是否可以使用现有的Promela编译器(它是用yacc构建的),使用llvm框架快速构建解析器(以及后来的IR生成器)。或者,您可以使用yacc语法并编写操作,直接使用llvm API生成llvm IR,绕过AST。