C语言解释器-21 补充:支持struct
2013-04-02 05:31
225 查看
偶有闲暇,添加了对结构的支持。也增加了对typedef structname synonym的支持。
技巧:
1. 结构成员在解析时转换成相对结构于的起始地址之偏移。
2. 在运行时计算成员的实际地址(运行时变量才会分配地址 )。
3. 成员按ValueOfPointerIndiction方式访问。
示例代码:
结果输出:
解析:
运行:
更深入的测试未进行。
源代码传送门:点击打开链接
技巧:
1. 结构成员在解析时转换成相对结构于的起始地址之偏移。
2. 在运行时计算成员的实际地址(运行时变量才会分配地址 )。
3. 成员按ValueOfPointerIndiction方式访问。
示例代码:
struct StructA { int a; int b; }; StructA theA; theA.a = 1; theA.b = 2; print("theA.a=%i\ntheA.b=%i", theA.a, theA.b); StructA *ptheA = &theA; ptheA->a = 3; ptheA->b = 4; print("theA.a=%i\ntheA.b=%i", theA.a, theA.b); print("ptheA->a=%i\nptheA->b=%i", ptheA->a, ptheA->b);
结果输出:
解析:
SharpC.Grammar.Variable: Line: 192 Pos: 1 "theA;" SharpC.Grammar.Statement: Line: 194 Pos: 1 "theA.a = 1;" SharpC.Grammar.Statement: Line: 195 Pos: 1 "theA.b = 2;" SharpC.Grammar.Statement: Line: 197 Pos: 1 "print("theA.a=%i\ntheA.b=%i", theA.a, theA.b);" SharpC.Grammar.Variable: Line: 199 Pos: 1 "ptheA = &theA;" SharpC.Grammar.Statement: Line: 199 Pos: 1 "ptheA = &theA;" SharpC.Grammar.Statement: Line: 201 Pos: 1 "ptheA->a = 3;" SharpC.Grammar.Statement: Line: 202 Pos: 1 "ptheA->b = 4;" SharpC.Grammar.Statement: Line: 204 Pos: 1 "print("theA.a=%i\ntheA.b=%i", theA.a, theA.b);" SharpC.Grammar.Statement: Line: 205 Pos: 1 "print("ptheA->a=%i\nptheA->b=%i", ptheA->a, ptheA->b);"
运行:
Declare [struct StructA "theA"] Address: 0x000001D0 Size: 8 Exp: [theA . (* int )[0x00000000]] Result: [(* int )[0x000001D0]] Exp: [(* int )[0x000001D0] = 1] Result: [(* int )[0x000001D0]] Exp: [theA . (* int )[0x00000004]] Result: [(* int )[0x000001D4]] Exp: [(* int )[0x000001D4] = 2] Result: [(* int )[0x000001D4]] Exp: [theA . (* int )[0x00000000]] Result: [(* int )[0x000001D0]] Exp: [theA . (* int )[0x00000004]] Result: [(* int )[0x000001D4]] Call function [void "print"] with [3] parameters Declare [char * "$var_char_ptr_161$"] Address: 0x00000194 Size: 4 Declare [int "$var_int_162$"] Address: 0x000001B8 Size: 4 Declare [int "$var_int_163$"] Address: 0x000001B0 Size: 4 Set parameter [char * "$var_char_ptr_161$"] = 64 Set parameter [int "$var_int_162$"] = 1 Set parameter [int "$var_int_163$"] = 2 print("theA.a=%i\ntheA.b=%i",1,2) Output of print: "theA.a=1\ntheA.b=2" Free function "print"'s arguments, count: 3 Free argument [char * "$var_char_ptr_161$"] Address: 0x00000194 Size: 4 Free argument [int "$var_int_162$"] Address: 0x000001B8 Size: 4 Free argument [int "$var_int_163$"] Address: 0x000001B0 Size: 4 All arguments are freed. Declare [struct * StructA "ptheA"] Address: 0x000001A0 Size: 4 Exp: [theA & ] Result: [464] Exp: [ptheA = 464] Result: [ptheA] Exp: [ptheA -> (* int )[0x00000000]] Result: [(* int )[0x000001D0]] Exp: [(* int )[0x000001D0] = 3] Result: [(* int )[0x000001D0]] Exp: [ptheA -> (* int )[0x00000004]] Result: [(* int )[0x000001D4]] Exp: [(* int )[0x000001D4] = 4] Result: [(* int )[0x000001D4]] Exp: [theA . (* int )[0x00000000]] Result: [(* int )[0x000001D0]] Exp: [theA . (* int )[0x00000004]] Result: [(* int )[0x000001D4]] Call function [void "print"] with [3] parameters Declare [char * "$var_char_ptr_164$"] Address: 0x000001A4 Size: 4 Declare [int "$var_int_165$"] Address: 0x000001C4 Size: 4 Declare [int "$var_int_166$"] Address: 0x0000019C Size: 4 Set parameter [char * "$var_char_ptr_164$"] = 36 Set parameter [int "$var_int_165$"] = 3 Set parameter [int "$var_int_166$"] = 4 print("theA.a=%i\ntheA.b=%i",3,4) Output of print: "theA.a=3\ntheA.b=4" Free function "print"'s arguments, count: 3 Free argument [char * "$var_char_ptr_164$"] Address: 0x000001A4 Size: 4 Free argument [int "$var_int_165$"] Address: 0x000001C4 Size: 4 Free argument [int "$var_int_166$"] Address: 0x0000019C Size: 4 All arguments are freed. Exp: [ptheA -> (* int )[0x00000000]] Result: [(* int )[0x000001D0]] Exp: [ptheA -> (* int )[0x00000004]] Result: [(* int )[0x000001D4]] Call function [void "print"] with [3] parameters Declare [char * "$var_char_ptr_167$"] Address: 0x00000184 Size: 4 Declare [int "$var_int_168$"] Address: 0x00000198 Size: 4 Declare [int "$var_int_169$"] Address: 0x000001D8 Size: 4 Set parameter [char * "$var_char_ptr_167$"] = 4 Set parameter [int "$var_int_168$"] = 3 Set parameter [int "$var_int_169$"] = 4 print("ptheA->a=%i\nptheA->b=%i",3,4) Output of print: "ptheA->a=3\nptheA->b=4" Free function "print"'s arguments, count: 3 Free argument [char * "$var_char_ptr_167$"] Address: 0x00000184 Size: 4 Free argument [int "$var_int_168$"] Address: 0x00000198 Size: 4 Free argument [int "$var_int_169$"] Address: 0x000001D8 Size: 4 All arguments are freed.
更深入的测试未进行。
源代码传送门:点击打开链接
相关文章推荐
- 21.1 windows_21_Library_Class_DLL 动态库补充1
- VC6不支持namespace::union/struct/enum::member的引用方式
- 对在Qtopia中添加国际化支持一文补充
- WCF热门问题编程示例(3):WCF是否使用或者支持IOCP完成端口(整理补充)
- Java学习笔记21(String类补充:正则表达式)
- 嵌入式LINUX环境搭建(SEED_DEC138软件用户手册的大大补充啊!支持原创啊!!)
- Java基础(极客)——21、Java多线程编程(补充)
- Wayland 几乎已经准备好支持 Fedora 21
- 对在Qtopia中添加国际化支持一文补充
- Wayland 几乎已经准备好支持 Fedora 21
- 21_ServletContext补充
- ELF文件解析之 ELF头 程序头表 节头表-补充之前文章代码 只支持32位 出版
- 21.2 windows_21_Library_Class_DLL_USE 动态库补充2
- JDBC -记录集-不支持此游标类型/并发组合 (补充)
- Fedora21安装RTEMS4.11编译环境(补充)
- struct求大小补充
- Struct 是值类型,不支持继承
- 21.3 windows_21_Library_DLL_test&&CPP&&DEF 动态库补充3
- Hyper-V虚拟化测试21Linux的支持
- C#与.NET程序员面试宝典 3.1.2 面试题21:C#支持哪几个预定义的引用类型