我在開發特定的源到源編譯器的項目。在這個階段,我需要在C源代碼中找到變量的類型。例如,如果代碼是c[i]=j*f[k]+p;
我應該找到的類型c
,i
,j
,f
,k
,並p
變量(int*
,float
,並且在源代碼中定義的任何其它類型)。有沒有工具可以這樣做?如果有多個工具,我更喜歡一個基於python的工具。需要一個工具來檢測C代碼中的變量類型
謝謝你。
我在開發特定的源到源編譯器的項目。在這個階段,我需要在C源代碼中找到變量的類型。例如,如果代碼是c[i]=j*f[k]+p;
我應該找到的類型c
,i
,j
,f
,k
,並p
變量(int*
,float
,並且在源代碼中定義的任何其它類型)。有沒有工具可以這樣做?如果有多個工具,我更喜歡一個基於python的工具。需要一個工具來檢測C代碼中的變量類型
謝謝你。
你可以使用pycparser寫自己的解析器,你可以找到更多的例子here
from pycparser import c_parser
parser = c_parser.CParser()
text = 'int x; int y; float z;'
ast = parser.parse(text, filename='<none>')
ast.show()
FileAST:
Decl: x, [], [], []
TypeDecl: x, []
IdentifierType: ['int']
Decl: y, [], [], []
TypeDecl: y, []
IdentifierType: ['int']
Decl: z, [], [], []
TypeDecl: z, []
IdentifierType: ['float']
小而方便的工具!但是,它看起來並不接受所有'C'語句。當'text'是所有變量聲明時它工作正常。不幸的是,如果代碼包含賦值語句,解析器就會發出警報!我應該深入瞭解它是如何工作的。謝謝。 – ahmad
@ahmad我認爲它處理所有有效的C代碼,檢查這個例子,你只需要聲明來找出變量的類型。 – iabdalkader
示例目錄比看起來更具信息性。我認爲'pycparser'可以做我需要的。謝謝。 – ahmad
,你應該能夠使用LLVM工具從源代碼創建AST,然後分析AST。除非你的任務是寫類似的LLVM工具:)
這裏是如何使用LLVM-綁定蟒蛇來分析C-文件的一個示例:
你不會從代碼段一樣,得到的類型。您將從相應的*聲明中獲得它們。*您的問題仍不清楚。 – EJP
當然。相關聲明可在完整來源中獲得。請假設代碼編寫得很好並且可以編譯。所以我們在解析過程中有所有相應的聲明。 – ahmad