[英]Parsing C files without preprocessing it
我想對C文件運行簡單的分析(例如,如果你用INT_TYPE
作為參數調用foo
宏,然后將響應轉換為int*
),我不想預處理文件,我只是想解析它(這樣,例如,我將有正確的行號)。
即,我想得到
#include <a.h>
#define FOO(f)
int f() {FOO(1);}
一個令牌列表
<include_directive value="a.h"/>
<macro name="FOO"><param name="f"/><result/></macro>
<function name="f">
<return>int</return>
<body>
<macro_call name="FOO"><param>1</param></macro_call>
</body>
</function>
無需設置包含路徑等
有沒有預先存在的解析器呢? 我知道的所有解析器都假設C是經過預處理的。 我想訪問宏和實際包含指令。
我們的C前端可以解析包含preprocesser元素的代碼,可以在相當程度上做到這一點,並且仍然構建一個可用的AST。 (是的,解析樹具有精確的文件/行/列號信息)。
有許多限制,允許它處理大多數代碼。 在少數情況下,它無法處理,通常是對源文件的一個小的,簡單的更改,給出等效的代碼解決了問題。
這是一套粗略的規則和限制:
根據我們的經驗,人們可以在幾個小時內修改50,000行的代碼庫來解決這些問題。 雖然這看起來很煩人(而且確實如此),但替代方案是根本無法解析源代碼,這比煩人的要糟糕得多。
您還需要的不僅僅是解析器。 請參閱解析后的生活 ,了解成功獲取解析樹后會發生什么。 我們在構建符號表方面做了一些額外的工作,其中聲明是使用嵌入它們的預處理器上下文記錄的,從而使類型檢查能夠包含預處理器條件。
你可以看看這個ANTLR語法 。 但是,您必須為預處理程序令牌添加規則。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.