# ParseStruct **Repository Path**: laterlove/parse-struct ## Basic Information - **Project Name**: ParseStruct - **Description**: 使用c++和vs2019编写的解析结构体项目,支持大部分的结构体成员类型解析,获取到每个成员的类型,成员名称。支持struct、enum、指针、数组、宏定义类型的数组大小等等。 - **Primary Language**: C++ - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-05-15 - **Last Updated**: 2022-05-22 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # ParseStruct #### 介绍 使用c++和vs2019编写的解析结构体项目,支持大部分的结构体成员类型解析,获取到每个成员的类型,成员名称。支持struct、enum、指针、数组、宏定义类型的数组大小等等。 #### 解析示例在[Parser.h](./test/Parser.h) ```c++ #pragma once #include "SLexer.h" #include #include "debug.h" #include using namespace std; #define max 30 #define maxva 0xdda30 typedef struct { struct sss str; uint8_t test_uint8_t; uint8_t* test_uint8_t; int32 * test_int32_; u16 (*test_u16ptr)() ; struct ad *fff; Tag type; string memberName; string structType; char **abc; float *bvs; unsigned int test_unsigned_int; long long testlonglong; unsigned int* test_unsigned_int; long long* testlonglong; unsigned short* (*testus)(int a,short b); long long testlonglong; int arrary[10]; void (*ptr)(); void* (*cdcd)(); double* dou[10]; char test_arr[max]; int * (*test)(int a,int b); char (*test_char)(int a,int b); int num; }StructMember; enum Tag{ Reverse=-1, Num = 128, Fun, Sys, Glo, Loc, Id, Char, Else, Struct, Define, Enum, If, Int, Return, Sizeof, While, Continue,Real, Assign, Cond, Lor, Lan, Or, Xor, And, Eq, Ne, Lt, Gt, Le, Ge, Shl, Shr, Add, Sub, Mul, Div, Mod, Inc, Dec, Break, A,O,E,L,G,N, Do, True,False,Double,Float,Void,Typedef,Other,Array,Bool,String,Vector,Set, Map,PTR, }; class Parser { public: Parser(); Parser(SLexer &l); virtual ~Parser(); char * GetType(Tag tag); CStruct stru; StructMember struMember; int index;//第几个结构体成员 map sMember; int flag; void printSmember(map str); void ParseStru(); private: SLexer lexer; Token look; Tag prevTag; bool move(); void error(string s); bool CheckStruct(string name); void parseStruct(); }; ``` #### 效果截图 ![](./image/QQ%E6%88%AA%E5%9B%BE20220515221757.png) ![](./image/QQ%E6%88%AA%E5%9B%BE20220515221829.png) ![](./image/QQ%E6%88%AA%E5%9B%BE20220515221841.png) #### 支持的数据类型 ```c++ KeyWord.insert(make_pair("struct", Token("struct", Tag::Struct))); KeyWord.insert(make_pair("enum", Token("enum", Tag::Enum))); KeyWord.insert(make_pair("string", Token("string", Tag::String))); KeyWord.insert(make_pair("vector", Token("struct", Tag::Vector))); KeyWord.insert(make_pair("set", Token("set", Tag::Set))); KeyWord.insert(make_pair("map", Token("map", Tag::Map))); KeyWord.insert(make_pair("char", Token("char", Tag::Char))); KeyWord.insert(make_pair("int", Token("int", Tag::Int))); KeyWord.insert(make_pair("float", Token("char", Tag::Float))); KeyWord.insert(make_pair("double", Token("double", Tag::Double))); KeyWord.insert(make_pair("void", Token("void", Tag::Void))); KeyWord.insert(make_pair("bool", Token("bool", Tag::Bool))); KeyWord.insert(make_pair("define", Token("define", Tag::Define))); KeyWord.insert(make_pair("class", Token("class", Tag::Class))); KeyWord.insert(make_pair("Uint8", Token("Uint8", Tag::Uint8))); KeyWord.insert(make_pair("Int8", Token("Int8", Tag::Int8))); KeyWord.insert(make_pair("Uint16", Token("Uint16", Tag::Uint16))); KeyWord.insert(make_pair("Int16", Token("Int16", Tag::Int16))); KeyWord.insert(make_pair("Uint32", Token("Uint32", Tag::Uint32))); KeyWord.insert(make_pair("Int32", Token("Int32", Tag::Int32))); KeyWord.insert(make_pair("long", Token("long", Tag::Long))); KeyWord.insert(make_pair("unsigned", Token("unsigned", Tag::Unsigned))); KeyWord.insert(make_pair("signed", Token("signed", Tag::Signed))); KeyWord.insert(make_pair("short", Token("short", Tag::Short))); KeyWord.insert(make_pair("Uint8_t", Token("Uint8_t", Tag::Uint8))); KeyWord.insert(make_pair("Int8_t", Token("Int8_t", Tag::Int8))); KeyWord.insert(make_pair("Uint16_t", Token("Uint16_t", Tag::Uint16))); KeyWord.insert(make_pair("Int16_t", Token("Int16_t", Tag::Int16))); KeyWord.insert(make_pair("Uint32_t", Token("Uint32_t", Tag::Uint32))); KeyWord.insert(make_pair("Int32_t", Token("Int32_t", Tag::Int32))); KeyWord.insert(make_pair("uint8", Token("uint8", Tag::Uint8))); KeyWord.insert(make_pair("int8", Token("int8", Tag::Int8))); KeyWord.insert(make_pair("uint16", Token("uint16", Tag::Uint16))); KeyWord.insert(make_pair("int16", Token("int16", Tag::Int16))); KeyWord.insert(make_pair("uint32", Token("uint32", Tag::Uint32))); KeyWord.insert(make_pair("int32", Token("int32", Tag::Int32))); KeyWord.insert(make_pair("U8", Token("U8", Tag::Uint8))); KeyWord.insert(make_pair("U16", Token("U16", Tag::Uint16))); KeyWord.insert(make_pair("U32", Token("U32", Tag::Uint32))); KeyWord.insert(make_pair("u8", Token("u8", Tag::Uint8))); KeyWord.insert(make_pair("u16", Token("u16", Tag::Uint16))); KeyWord.insert(make_pair("u32", Token("u32", Tag::Uint32))); KeyWord.insert(make_pair("uint8_t", Token("uint8_t", Tag::Uint8))); KeyWord.insert(make_pair("int8_t", Token("int8_t", Tag::Int8))); KeyWord.insert(make_pair("uint16_t", Token("uint16_t", Tag::Uint16))); KeyWord.insert(make_pair("int16_t", Token("int16_t", Tag::Int16))); KeyWord.insert(make_pair("uint32_t", Token("uint32_t", Tag::Uint32))); KeyWord.insert(make_pair("int32_t", Token("int32_t", Tag::Int32))); KeyWord.insert(make_pair("uint", Token("uint", Tag::UInt))); KeyWord.insert(make_pair("(", Token("(", Tag::LC))); KeyWord.insert(make_pair("*", Token("*", Tag::Mul))); ``` #### 使用方法 直接运行vs2019即可。 - 前提需要将c++标准设置为c++17 ![](/image/20220515223601.png)