作者mshockwave (夏克维夫)
看板CompilerDev
标题Re: [问题] clang pragma with template id
时间Thu Jun 11 00:31:27 2020
我不确定能不能回答你的问题 但小弟最近刚好也在玩 clang pragma handler
就来献丑一下:我尝试过非常多的方法 但结论就是尽量不要去碰 parser
原因不外乎 clang parser不像是 preprocessor 有 pragma, attribute, 甚至
PPCallback(注),或是AST部分有 ASTConsumer 可以用 plugin 上下其手的地方
parser的生态系非常封闭,如果不是从头parse到尾的话很容易出错
所以我在做我自己的pragma handler 的时候一律是直接注入自己生成,或者客制化的
Token。
我有点看不懂你最终想要做什麽,但假设你的 pragma 是会生出一堆新的程式码
也就是 class UserConfig,那我觉得你可以在解析完 value = 3*3之後,直接
生出一串构成 UserConfig class 的 Tokens,也就是 'class' 'UserConfig' '{'
等等。
接下来就是要注入这些 Token,方法有好几种。其中一种是利用
Preprocessor::EnterTokenStream 来注入。但老实讲我没亲身用过这函式所以不确定
到底好不好用,你可能要详细阅读一下他在 Preprocessor.cpp 里面的注解
另外一个方法是把你刚刚那串 Tokens 定义成一个新的 Macro。动态插入一个 macro 蛮
简单的,但缺点当然就是你在程式码的某个地方事先就要呼叫那个 macro 他才会被
展开
希望这些对你有帮助
注:PPCallback不能用 plugin 的方式来插入,但你可以在 PragmaHandler 里面呼叫
Preprocessor::addPPCallback 来插入一个客制的PPCallback
※ 引述《nevak (^o^)》之铭言:
: 庆祝CompilerDev开版,贡献(?)一题发问
: 最近工作上需要增加一些pragma支援
: 原本我们的parser可以正确处理pragma中设定的参数
: 例如以下片段,Current Support部分
: https://gitlab.com/snippets/1985048
: 目前我们是利用clang::Parser::ParseConstantExpression 去parse参数
: http://tiny.cc/byukqz
: 因此只要是constant expression都可以解出来,例如3 * 3
: 我们现在想要增加支援static const class member
: 理论上也可以透过template去做设定,例如以下片段Expected Support
: https://gitlab.com/snippets/1985048
: 想请问一下关於这个实做有没有什麽提示该从何处下手
: 谢谢
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 169.234.228.195 (美国)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/CompilerDev/M.1591806690.A.16E.html
※ 编辑: mshockwave (169.234.228.195 美国), 06/11/2020 00:33:00