我正在使用CIL使用pthread库处理C程序。我必须以不同于pthread函数的方式处理用户定义和非pthread函数。我可以使用类似于:
的类型定义type PThreadFun = "pthread_create" | "pthread_join" | ...;;
这样我首先在函数名称上进行模式匹配,然后将其发送到
processFunction (fn_name: string)
或
processPThreadFun (fn_name: PThreadFun)
答案 0 :(得分:4)
您可以在OCaml中拥有sum types,它们被称为variants。但他们的价值不是字符串。你可以声明
type pthreadfun_t = Pthread_create | Pthread_join (* etc *);
然后你需要一些处理CIL表示的代码来找到这样的pthreadfun_t
值。
BTW,您可能对MELT感兴趣,GCC是扩展Gimple编译器的特定于域的语言。 MELT适用于内部GCC表示,特别是{{3}}。它不是基于Ocaml或CIL的,但它是一个GCC插件,为您提供强大的类似Lisp的域特定语言,具有强大的模式匹配,包括匹配Gimple-s,Tree-s,字符串的能力等等......