簡體   English   中英

解析C源文件

[英]Parsing C source file

如果我有一個C源文件,我想在一個函數中找到一個特定的局部變量並使其全局 - 所以另一個工具能夠處理C文件(我沒寫的工具)什么是最簡單的方法做這個? 我正在考慮使用正則表達式,但即使這樣也有它自己的問題。 這有點像用Java編寫一個迷你C解析器。很多工作:S

是否有任何庫可以幫助簡化這一過程?

例如,假設我想將變量“i”變為全局變量。 用戶將指定函數名稱和變量名稱(但不是變量的類型 - 即“int”)。

我可以使用正則表達式找到函數 - 當然。 但從那里我真的不知道最好的方法是什么?... CDT插件會有幫助嗎?

例:

 /* 
  * add.c
  * a simple C program
  *
  */

#include <stdio.h>
#define LAST 10

int main()
{
    int i = 0;
    int sum = 0;

    for ( i = 1; i <= LAST; i++ ) {
      sum += i;
    } /*-for-*/
    printf("sum = %d\n", sum);

    return 0;
}

轉換成:

 /* 
  * add.c
  * a simple C program
  *
  */

#include <stdio.h>
#define LAST 10

int i = 0;

int main()
{

    int sum = 0;

    for ( i = 1; i <= LAST; i++ ) {
      sum += i;
    } /*-for-*/
    printf("sum = %d\n", sum);

    return 0;
}

即使你能夠想出一種方法來進行這樣的轉換,我認為這不是一個好主意。 由於你在建築和破壞中移動,程序將不會保持不變。 此外,並非所有類型都是默認可構造或可復制的,因此通常無法進行轉換。

您只對幾種簡單類型感興趣嗎? 然后將其作為解決方案的一部分。 是否生成了原始代碼? 另外,您如何信任僅通過名稱識別本地對象? 同名也可用於不同類型的對象。

如果你只做一些簡單的例子,你可以使用Perl或一些java正則表達式來解決這個問題。 它無法在復雜程序上可靠地工作,因為您需要一個真正的解析器。

我們的DMS軟件再造工具包及其C前端可以非常可靠地用於此。

DMS提供通用程序分析和轉換功能,通過編程語言描述進行參數化。 DMS的C Front向DMS解釋了C的精確語法(對於C的各種方言,包括GCC和MS); 它實際上提供了一個完整的解析器,生成抽象語法樹(以及反向:來自AST的C代碼生成器)這允許DMS准確讀取C源文件,包括預處理。

使用AST表單中的已解析代碼,您可以構建DMS函數和/或編寫模式以查找函數定義,特別是您的目標變量。 然后可以使用DMS代碼或可替換的源到源變換來將變量提升出函數,和/或插入代碼以跟蹤該變量的狀態變化以便可以看到它。

因此,使用DMS和一些自定義代碼,您可以實現所需的效果。 您提供的示例可能與DMS相當簡單,但學習曲線將會很多; DMS很復雜,因為它處理的語言很復雜,你必須學習如何使用它。 所以,對於一個新手來說,這不是一個下午的練習。

注意:您需要對預處理程序執行此操作(否則您通常無法可靠地解析它們)。 所以,這應該是你在編譯之前做的事情,不應該成為最終代碼的一部分。

如果要進行永久性代碼更改,則需要解析未經處理的代碼; 這對heckuva來說更難了。 DMS的C前端可以在預處理器指令“結構化”的范圍內執行此操作; 其中約95%是。 所以現在你遇到了一個新問題:要么修復非結構化的問題(一次性手動更改),要么拒絕無法用“運氣不好”解析的文件。

您可以使用GCC代替DMS; 畢竟它有一個經過良好測試的C解析器。 但是,它無法幫助您生成修改后的C代碼。 另一個替代方案是Clang,它作為一個相當不錯的選擇而快速上升。 我認為它會解析C ++; 不太確定C或特別是最終用戶可能使用的C方言(你沒說)。 它有像DMS這樣的AST,以及一種為可能有效的代碼生成“補丁”的方案。

我要求的第一件事就是完全確定何時需要以及為什么,以及如何在不對程序語義產生負面影響的情況下確定何時安全。 這是一個非常糟糕的主意。 很明顯,那些給你作業的人不知道實現復雜性,這是巨大的,還是不利的語義效應。 我猜他們因此也無法提出足夠的規范,這最終會讓你失望。

我也會引起他們的注意,特別是艾拉巴克斯特的評論。 我曾經以構建編譯器為生。 在論壇上學習或詢問不是一項任務。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM