2012-06-14 55 views
3

我有興趣使用Python以遞歸方式解析C頭文件(只有結構和變量聲明)。Python C頭文件解析和反向初始化

這是我正在尋找的一個例子。假設如下:

typedef struct 
{ 
    double value[3]; 
} vector3; 

typedef struct 
{ 
     unsigned int variable_a[4][2]; 
     vector3 variable_b[5]; 
} my_example; 

而且,假設有一個包含初始值,如文件:

ANCHOR_STRUCT(my_example) = 
{ 
    // variable_a 
    { {1,2}, {3, 4}, {5,6} ,{7,8} }, 

    // variable_b 
    { {1.0,2.0,3.0}, {4.0,5.0,6.0}, {7.0,8.0,9.0}, {10.0,11.0,12.0}, {13.0,14.0,15.0} } 
} 

我希望能夠解析這兩個文件,並能夠產生報告如:

OUTPUT: 
my_example.variable_a[0][0] = 1 
my_example.variable_a[0][1] = 2 
my_example.variable_a[1][0] = 3 
my_example.variable_a[1][1] = 4 
my_example.variable_a[2][0] = 5 
my_example.variable_a[2][1] = 6 
my_example.variable_a[3][0] = 7 
my_example.variable_a[3][1] = 8 

my_example.variable_b[0].value[0] = 1 
my_example.variable_b[0].value[1] = 2 
my_example.variable_b[0].value[2] = 3 
my_example.variable_b[1].value[0] = 4 
my_example.variable_b[1].value[1] = 5 
my_example.variable_b[1].value[2] = 6 
my_example.variable_b[2].value[0] = 7 
my_example.variable_b[2].value[1] = 8 
my_example.variable_b[2].value[2] = 9 
my_example.variable_b[3].value[0] = 10 
my_example.variable_b[3].value[1] = 11 
my_example.variable_b[3].value[2] = 12 
my_example.variable_b[4].value[0] = 13 
my_example.variable_b[4].value[1] = 14 
my_example.variable_b[4].value[2] = 15 

我希望能夠報告這個沒有運行的代碼(只通過解析)。是否存在可解析和打印此信息的Python工具?我也想打印出數據類型。

在解析文件中解析「{」和「,」和「}」似乎有點複雜,並且能夠將其與結構的變量和子元素進行匹配。將值與正確的代碼名稱相匹配似乎很困難,因爲順序非常重要。我還假定父/子/孫子變量需要遞歸。

感謝, 斯內德

+0

可能有用:https://fedorahosted.org/gcc-python-plugin/ – bstpierre

回答

0

除非你限制自己的簡單數據類型,這會變得非常複雜。例如,你想處理任意數據類型,比如嵌套類嗎?

你說你不想運行c-sources,但是你在這裏要做的是建立你自己的c-interpreter!你確定你想重新發明輪子嗎?如果是...

您需要做的第一件事就是解析文件。您可以使用解析器+詞典分析器,如PLY。一旦你有了解析樹,你就可以分析你的變量是什麼以及它們的預期值是什麼。

+0

謝謝。我希望能夠解析複雜的數據類型,嵌套classes.PLes處理解析的初始化文件?如果沒有,你知道一個可以解析初始化文件並將其與結構變量相匹配的文件嗎? – codeshark

+0

如果OP真的想要處理「複雜類型」,他需要能夠查找typedef名稱==>除AST之外,他至少需要符號表。這裏的教訓是解析器和AST幾乎不足以完成一些有趣的真實語言。閱讀我關於Life Beyond Parsing的文章:www.semanticdesigns.com/Products/DMS/LifeBeyondParsing.html –

+0

@Ira Baxter,同意。在大多數情況下,我認爲只需在c代碼的問/寫包裝中運行c代碼就可以更容易地獲取信息 – Dhara