Python pycparser(c文件解析)模塊使用教程

文章目錄

  • 安裝 pycparser 模塊
  • 模塊開發者網址
  • 獲取抽象語法樹
    • 1. 需要導入的模塊
    • 2. 獲取 不關注預處理相關 c語言文件的抽象語法樹ast
    • 3. 獲取 預處理后的c語言文件的抽象語法樹ast
  • 語法樹組成
    • 1. 數據類型定義 Typedef
    • 2. 類型聲明 TypeDecl
    • 3. 標識符類型 IdentifierType
    • 4. 變量聲明 Decl
    • 5. 常量 Constant
    • 6. 函數定義 FuncDef
    • 7. 函數聲明 FuncDecl
    • 8. 函數參數列表 ParamList
    • 9. 代碼塊 Compound
  • to do

感謝這兩篇文章對于我學習之初的幫助
https://blog.csdn.net/u011079613/article/details/122462729
https://blog.csdn.net/qq_38808667/article/details/118059074

安裝 pycparser 模塊

pip install pycparser -i  https://mirrors.aliyun.com/pypi/simple/

模塊開發者網址

https://github.com/eliben/pycparser

獲取抽象語法樹

1. 需要導入的模塊

# parser_file 用于處理c語言文件
from pycparser import parse_file
from pycparser import CParser
# c語言有錯誤時,會引出此錯誤
from pycparser.plyparser import ParseError
# c_ast.py 文件下包含了抽象語法樹的節點類
from pycparser.c_ast import *

2. 獲取 不關注預處理相關 c語言文件的抽象語法樹ast

文件中需刪除 #開頭 預處理代碼,不能有注釋代碼

  1. 方法1:
ast = parse_file(filename, use_cpp = False)
  1. 方法2:
with open(filename, encoding='utf-8',) as f:txt = f.read()
ast = CParser().parse(txt)  # 使用此方法需要 刪除頭文件

3. 獲取 預處理后的c語言文件的抽象語法樹ast

獲取c語言文件的抽象語法樹ast,如果要處理 #include 等語句,需要下載fake_libc_include文件夾,讓編譯器預處理常用的方法(添加其到代碼的抽象語法樹中)
點擊此處下載 fake_libc_include
在這里插入圖片描述
cpp_args必須加上 -E , 否則返回的抽象語法樹是個空列表

ast = parse_file(filename, use_cpp = True, cpp_path=r'C:\MinGW\bin\gcc.exe', cpp_args=['-E', r'-Iutils/fake_libc_include'])

使用 parse_file 類獲取 預處理后的c語言文件的抽象語法樹ast

parse_file 參數說明
filename需要解析的 .c 文件名
use_cpp是否使用本地c語言編譯器預處理代碼,去掉其中的#命令(頭文件、宏定義、pragma)值:False/True
cpp_path本地c語言編譯器路徑
cpp_argsfake_libc_include文件夾路徑,需要在路徑添加 -I 指明所包頭文件路徑; use_cpp=True 時使用

語法樹組成

抽象語法樹 ast 類型為 <class 'pycparser.c_ast.FileAST'>

其解析的具體內容通過 print(ast.ext) 查看,ext 數據類型為列表

FileAST 下級節點只有 3 種可能 :

  • Typedeftypedef 數據類型定義
  • Decl變量聲明
  • FuncDef函數聲明

示例:
test.c

typedef int uint32;
int g =0;
int add(int a, int b)
{int c = 0;c = a + b;return c;
}
int main(void)
{printf("hello world");return 0;
}

cparser.py

# parser_file 用于處理c語言文件
from pycparser import parse_file
from pycparser import CParser
# c語言有錯誤時,會引出此錯誤
from pycparser.plyparser import ParseError
# c_ast.py 文件下包含了抽象語法樹的節點類
from pycparser.c_ast import *filename = 'test.c'ast = parse_file(filename, use_cpp = False)print(type(ast))for eachNode in ast.ext:print(eachNode.__class__.__name__)  # 打印節點類型名#print(eachNode)   # 打印節點內容

輸出
在這里插入圖片描述

1. 數據類型定義 Typedef

Typedef 數據結構類型 <class 'pycparser.c_ast.Typedef'>

數據類型定義 Typedef 屬性如下:

  • Typedef.name = strTypedef 定義對象)
  • Typedef.quals = [str] (限定符號列表: const, volatile
  • Typedef.storage = [str] (存儲說明符列表: extern, register, etc.
  • Typedef.type = NodeTypeDecl節點)
  • Typedef.coord= str(定義對象所在行列)
    • Typedef.coord.column= str(定義對象所在列)
    • Typedef.coord.line= str(定義對象所在行)
    • Typedef.coord.file= str(定義對象所在文件)

示例:
test.c


typedef const int cuint32;

cparser.py

# parser_file 用于處理c語言文件
from pycparser import parse_file
from pycparser import CParser
# c語言有錯誤時,會引出此錯誤
from pycparser.plyparser import ParseError
# c_ast.py 文件下包含了抽象語法樹的節點類
from pycparser.c_ast import *filename = 'test.c'ast = parse_file(filename, use_cpp = False)print(type(ast.ext[0]))print('name = ', ast.ext[0].name)  # Typedef 定義對象
print('quals = ', ast.ext[0].quals)
print('storage = ', ast.ext[0].storage)
print('type = ', ast.ext[0].type)
print('coord = ', ast.ext[0].coord)

輸出
在這里插入圖片描述

2. 類型聲明 TypeDecl

Typedef 的下一級 類型聲明 TypeDecl 是以typedef語句格式為中心

類型聲明 TypeDecl 屬性如下:

  • TypeDecl.declname= strtypedef定義對象)
  • TypeDecl.quals = [str] (限定符號列表: const, volatile
  • TypeDecl.align= [str] (暫不清楚)
  • TypeDecl.type = NodeIdentifierType節點)
  • TypeDecl.coord= str(定義對象所在行列)
    • TypeDecl.coord.column= str(定義對象所在列)
    • TypeDecl.coord.line= str(定義對象所在行)
    • TypeDecl.coord.file= str(定義對象所在文件)

示例:
test.c


typedef const int cuint32;

cparser.py

# parser_file 用于處理c語言文件
from pycparser import parse_file
from pycparser import CParser
# c語言有錯誤時,會引出此錯誤
from pycparser.plyparser import ParseError
# c_ast.py 文件下包含了抽象語法樹的節點類
from pycparser.c_ast import *filename = 'test.c'ast = parse_file(filename, use_cpp = False)print(type(ast.ext[0].type))my_typeDecl = ast.ext[0].typeprint('name = ', my_typeDecl.declname)  # Typedef 定義對象
print('quals = ', my_typeDecl.quals)
print('type = ', my_typeDecl.type)
print('storage = ', my_typeDecl.align)
print('coord = ', my_typeDecl.coord)
print('coord.column = ', my_typeDecl.coord.column)  # (定義對象所在列)
print('coord.line = ', my_typeDecl.coord.line)  # (定義對象所在行)
print('coord.file = ', my_typeDecl.coord.file)  # (定義對象所在文件)

輸出
在這里插入圖片描述

3. 標識符類型 IdentifierType

TypeDecl 的下一級 標識符類型 IdentifierType 是簡單標識符,比如 void, char 定義之類
原數據類型 : <class 'pycparser.c_ast.IdentifierType'>

標識符類型 IdentifierType 屬性如下:

  • IdentifierType.name = [str] (標識符字符串列表)
  • IdentifierType.coord= str(定義對象所在行列)
    • IdentifierType.coord.column= str(定義對象所在列)
    • IdentifierType.coord.line= str(定義對象所在行)
    • IdentifierType.coord.file= str(定義對象所在文件)

4. 變量聲明 Decl

Decl 數據結構類型 <class 'pycparser.c_ast.Decl'>

變量聲明 Decl 屬性如下:

  • Decl.name = str (被聲明的變量名)
  • Decl.quals = [str] (限定符號列表: const, volatile)
  • Decl.align= [str] (暫不清楚)
  • Decl.storage = [str] (存儲說明符列表: extern, register, static等)
  • Decl.funcspec = [str] (函數說明符列表: C99的inline)
  • Decl.type = Node TypeDecl 節點)
  • Decl.init = Node (初始化值,Constant節點)
  • Decl.bitsize = Node (位域bit field大小,或者為None)
  • Decl.coord= str(定義對象所在行列)
    • Decl.coord.column= str(定義對象所在列)
    • Decl.coord.line= str(定義對象所在行)
    • Decl.coord.file= str(定義對象所在文件)

示例:
test.c


typedef const int cuint32;static const int g =0;

cparser.py

# parser_file 用于處理c語言文件
from pycparser import parse_file
from pycparser import CParser
# c語言有錯誤時,會引出此錯誤
from pycparser.plyparser import ParseError
# c_ast.py 文件下包含了抽象語法樹的節點類
from pycparser.c_ast import *filename = 'test.c'ast = parse_file(filename, use_cpp = False)print(type(ast.ext[1]))my_ext = ast.ext[1]print('name = ', ast.ext[1].name)  # Typedef 定義對象
print('quals = ', ast.ext[1].quals)
print('align = ', ast.ext[1].align)
print('storage = ', ast.ext[1].storage)
print('funcspec = ', ast.ext[1].funcspec)
print('type = ', ast.ext[1].type)
print('init = ', ast.ext[1].init)
print('bitsize = ', ast.ext[1].bitsize)
print('coord = ', ast.ext[1].coord)

輸出
在這里插入圖片描述

5. 常量 Constant

常量 Constant 屬性如下:

  • Constant.type= str (基本數據類型,int等)
  • Constant.value= str (數值)
  • Constant.coord= str(定義對象所在行列)
    • Constant.coord.column= str(定義對象所在列)
    • Constant.coord.line= str(定義對象所在行)
    • Constant.coord.file= str(定義對象所在文件)

6. 函數定義 FuncDef

FuncDef 方法定義,不同于 FuncDecl,有具體的函數實現過程

函數定義 FuncDef 屬性如下:

  • FuncDef.decl = Node (一般是包含Decl的節點)
  • param_decls=None (暫不清楚)
  • FuncDef.body = Node (函數實現的代碼塊 一般是包含Compound 的節點)
  • FuncDef.coord= str(標識符字符串所在行列)
    • FuncDef.coord.column= str(定義對象所在列)
    • FuncDef.coord.line= str(定義對象所在行)
    • FuncDef.coord.file= str(定義對象所在文件)

7. 函數聲明 FuncDecl

FuncDecl 既可以單獨存在,也可以是函數定義的一部分

函數定義 FuncDecl 屬性如下:

  • FuncDecl.args= Node (一般是包含ParamList的節點)
  • FuncDecl.type= [str] (一般是包含TypeDecl的節點)

8. 函數參數列表 ParamList

以 list 形式,可遍歷 參數
函數定義 ParamList 屬性如下:

  • ParamList.params= [str](有哪些參數 ,一般是包含Decl的節點)

9. 代碼塊 Compound

以 list 形式,可遍歷 代碼塊內容

函數定義 Compound 屬性如下:

  • Compound .block_items= [str](有哪些參數 ,一般是包含 Decl Assignment 和 Return的節點)

to do

解析任意編程語言 tree-sitter

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/39273.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/39273.shtml
英文地址,請注明出處:http://en.pswp.cn/news/39273.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

語聚AI公測發布,大語言模型時代下新的生產力工具

語聚AI 公測發布 距離語聚AI內測上線已經過去近1個月。 這期間&#xff0c;我們共邀請了近百位資深用戶與行業專家加入語聚AI產品體驗。通過大家的熱情參與積極反饋&#xff0c;我們不斷優化并完善了語聚AI的功能與使用體驗。 經過研發團隊不懈的努力&#xff0c;今天語聚AI終…

【Leetcode】88.合并兩個有序數組

一、題目 1、題目描述 給你兩個按 非遞減順序 排列的整數數組 nums1 和 nums2,另有兩個整數 m 和 n ,分別表示 nums1 和 nums2 中的元素數目。 請你 合并 nums2 到 nums1 中,使合并后的數組同樣按 非遞減順序 排列。 注意:最終,合并后數組不應由函數返回,而是存儲在數…

梅賽德斯-奔馳將成為首家集成ChatGPT的汽車制造商

ChatGPT的受歡迎程度毋庸置疑。OpenAI這個基于人工智能的工具&#xff0c;每天能夠吸引無數用戶使用&#xff0c;已成為當下很受歡迎的技術熱點。因此&#xff0c;有許多公司都在想方設法利用ChatGPT來提高產品吸引力&#xff0c;賣點以及性能。在汽車領域&#xff0c;梅賽德斯…

代碼隨想錄算法訓練營第59天|動態規劃part16|583. 兩個字符串的刪除操作、72. 編輯距離、編輯距離總結篇

代碼隨想錄算法訓練營第59天&#xff5c;動態規劃part16&#xff5c;583. 兩個字符串的刪除操作、72. 編輯距離、編輯距離總結篇 583. 兩個字符串的刪除操作 583. 兩個字符串的刪除操作 思路&#xff1a; 思路見代碼 代碼&#xff1a; python class Solution(object):de…

[國產MCU]-BL602開發實例-I2C與總線設備地址掃描

I2C與總線設備掃描 文章目錄 I2C與總線設備掃描1、I2C介紹2、I2C驅動API介紹3、I2C使用實例I2C (Inter-Intergrated Circuit)是一種串行通訊總線,使用多主從架構,用來連接低速外圍裝置。 每個器件都有一個唯一的地址識別,并且都可以作為一個發送器或接收器。每個連接到總線的…

node-sass是什么

一、Sass&#xff08;Syntactically Awesome Style Sheets&#xff09; 是一種CSS預處理器&#xff0c;它擴展了CSS的功能并提供了更強大的樣式表語言。Sass允許開發人員使用變量、嵌套規則、混合&#xff08;Mixins&#xff09;、繼承等高級功能來編寫更簡潔、可維護的樣式代…

2023年國賽數學建模思路 - 案例:FPTree-頻繁模式樹算法

文章目錄 算法介紹FP樹表示法構建FP樹實現代碼 建模資料 ## 賽題思路 &#xff08;賽題出來以后第一時間在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 算法介紹 FP-Tree算法全稱是FrequentPattern Tree算法&#xff0c;就是頻繁模式樹算法&#xff0c…

QT-Mysql數據庫圖形化接口

QT sql mysqloper.h qsqlrelationaltablemodelview.h /************************************************************************* 接口描述&#xff1a;Mysql數據庫圖形化接口 擬制&#xff1a; 接口版本&#xff1a;V1.0 時間&#xff1a;20230727 說明&#xff1a;支…

基于VUE3+Layui從頭搭建通用后臺管理系統(前端篇)九:自定義組件封裝下

一、本章內容 續上一張,本章實現一些自定義組件的封裝,包括文件上傳組件封裝、級聯選擇組件封裝、富文本組件封裝等。 1. 詳細課程地址: 待發布 2. 源碼下載地址: 待發布 二、界面預覽 三、開發視頻 基于VUE3+Layui從頭搭建通用后臺管

【軟件工程】內聚

概念 是指一個模塊內部個成分之間相互關聯程度的度量。也就是說&#xff0c;凝聚是對模塊內各處理動作組合強度的一種度量。很顯然&#xff0c;一個模塊的內聚越大越好。 偶然凝聚 一個模塊內的各處理元素之間沒有任何聯系&#xff0c;只是偶然地被湊到一起。這種模塊也稱為…

mov轉mp4格式怎么轉?

mov轉mp4格式怎么轉&#xff1f;眾所周知&#xff0c;MOV視頻格式是由蘋果公司推出的常用的視頻格式&#xff0c;能夠在蘋果軟件及設備上使用。但是&#xff0c;如果將其應用于其他軟件和設備上的話&#xff0c;可能會遇到文件無法正常播放的情況。在這個時候&#xff0c;我們需…

Linux MQTT智能家居項目(LED界面的布局設置)

文章目錄 前言一、LED界面布局準備工作二、LED界面布局三、邏輯實現總結 前言 上篇文章我們完成了主界面的布局設置那么這篇文章我們就來完成各個界面的布局設置吧。 一、LED界面布局準備工作 首先添加LED燈光控制的圖標。 將選擇好的LED圖標添加進來&#xff1a; 圖標可以…

drawio導出矢量圖

1.選中要導出的圖 2.導出為pdf 3.用adobe打開pdf&#xff0c;另存為eps

華為認證含金量如何

華為認證是指通過華為技術有限公司官方認證考試所獲得的認證資格。華為認證主要分為三個級別&#xff1a;華為認證工程師&#xff08;HCIE&#xff09;、華為認證專家&#xff08;HCNP&#xff09;和華為認證技術專家&#xff08;HCNA&#xff09;&#xff0c;每個級別都有不同…

在測試環境進行sqlserver鎖表測試

將某表設置X鎖1分鐘&#xff1a; begin tran select top 1 * from tableName with (tablockx) waitfor delay 00:01:00 commit tran 查詢當前被鎖的表&#xff1a; --查詢鎖表的事務ID&#xff0c;被鎖表名&#xff0c;鎖模式&#xff0c;客戶端主機名&#xff0c;客戶端程序…

你真的了解數據結構與算法嗎?

數據結構與算法&#xff0c;是理論和實踐必須緊密結合的一門學科&#xff0c;有關數據結構和算法同類的課程或書籍&#xff0c;有些只是名為“數據結構”&#xff0c;而非“數據結構與算法”&#xff0c;它們在內容上并無很大區別。 實際上&#xff0c;數據結構和算法&#xf…

【華為認證 Datacom 練習題(有答案喲)】

1&#xff08;單選題&#xff09;下列配置默認路由的命令中&#xff0c;正確的是&#xff08;&#xff09;。 A、 B、 C、 D、 正確答案A 2&#xff08;單選題&#xff09;UDP是面向無連接的&#xff0c;必須使用&#xff08;&#xff09;來提供傳輸的可靠性。 A、網絡層…

深入源碼分析kubernetes informer機制(零)簡單了解informer

[閱讀指南] 基于kubernetes 1.27 stage版本 為了方便閱讀&#xff0c;后續所有代碼均省略了錯誤處理及與關注邏輯無關的部分。 文章目錄 關于client-goInformer是什么為什么需要informerInformer工作流程后續分析計劃 關于client-go client-go是kubernetes節點與服務端進行資源…

揭秘熱門工作秘籍:ChatGPT大顯身手!輕松提升工作效率的高效Prompt技巧曝光!

目錄 01 背景 福利&#xff1a;文末有chat-gpt純分享&#xff0c;無魔法&#xff0c;無限制 02 AI 可以幫助程序員做什么&#xff1f; 2.1 技術知識總結 2.2 拆解任務 2.3 閱讀代碼/優化代碼 2.4 代碼生成 2.5 生成單測 2.6 更多 AI 應用/插件 AIPRM Voice Control for Ch…

2023企業微信0day漏洞復現以及處理意見

2023企業微信0day漏洞復現以及處理意見 一、 漏洞概述二、 影響版本三、 漏洞復現小龍POC檢測腳本: 四、 整改意見 免責聲明&#xff1a;請勿利用文章內的相關技術從事非法測試&#xff0c;由于傳播、利用此文所提供的信息或者工具而造成的任何直接或者間接的后果及損失&#x…