# 基于Python的TinyC_Compliler **Repository Path**: coldz/compilerTraining ## Basic Information - **Project Name**: 基于Python的TinyC_Compliler - **Description**: 编译原理实训 - **Primary Language**: Python - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-01-05 - **Last Updated**: 2021-06-30 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 编译原理实训 #### 学习网址 https://pandolia.net/tinyc/ch16_tinyc_compiler.html #### 完整操作 ~~~shell flex scanner.l bison -vdty parser.y gcc -o tcc-frontend lex.yy.c y.tab.c ./tcc-frontend test.c #将利用 tcc-frontend 编译 test.c ,生成 Pcode 文件 test.asm 以及宏文件 test.inc 。对比一下前面的 test.pcode 和 test.funcmacro 文件,二者几乎是一模一样的。 gcc -m32 -c -o tio.o tio.c ar -crv libtio.a tio.o nasm -f elf32 -P"macro.inc" -P"test.inc" -o test.o test.asm #以下目前只有在centos下才执行成功 ld -m elf_i386 -o test test.o -L. -ltio ./test ~~~ #### 注意 - 词法分析路径目前定义的是绝对路径,换位置就会出错 - 词法分析和其他阶段运行程序分离,词法运行两次,一次单独输出词法表(cifa文件夹下),另一个将词法表向后传递(tinyc文件夹下)。 #### 使用说明 查看编译器中的Help #### 环境 ~~~shell 首推命令齐全的Centos, or flex、bison、gcc、nasm、ld所有指令!!具备的条件下的环境 ~~~ #### 整个过程 ###### 词法分析: ~~~shell flex scanner.l #生成 词法分析程序 lex.yy.c #如果是在cifa 文件夹执行下会生成 词法表cifa.out ~~~ ###### 语法分析: ~~~shell bison -vdty parser.y #生成 语法分析程序y.tab.c 词法分析用到的头文件 y.tab.h #生成 文法、语法树、预测分析表y.output ~~~ ###### 中间代码生成: ~~~shell gcc -o tcc-frontend lex.yy.c y.tab.c ./tcc-frontend test.c #生成 pcode中间文件 test.asm #生成 x86汇编语言(宏文件) test.inc ~~~ ###### 目标代码生成: ~~~shell gcc -m32 -c -o tio.o tio.c ar -crv libtio.a tio.o #第一步,生成 库函数 可执行文件 tio.o #第二步,生成 宏指令链接需要用到的库文件 libtio.a(关键) nasm -f elf32 -P"macro.inc" -P"test.inc" -o test.o test.asm ld -m elf_i386 -o test test.o -L. -ltio #第三步中,【NASM宏文件】 macro.inc 【测试代码宏指令】test.inc 生成目标汇编文件 #第四步中,汇编语言链接 tio库 到此tio.c 和macro.inc两个库都使用完毕 (centos下) ./test #第五步中,执行目标文件 (centos下) ~~~ ###### 杂记 ~~~ Tinyc 数据类型:只有 int 一种(32位) 语句:只有四种,赋值语句、函数调用语句、控制语句( if 语句)和循环语句( while 语句) 输出不是pirntf,是print 仅支持 if/else 和 while 语句 中间代码Pcode,中间代码 Pcode 一共才7组命令,参数入栈简化,与事实略有不同 顺序:涉及后缀表达式 if 和 while 语句利用 jz 和 jmp 命令就可以实现 .asm文件就是中间代码生成文件 词法分析 xxxx.l 词法分析器 声明、定义、规则、用户定义过程。 规则:正则表达式(有限自动机)---------yylex()--执行词法分析action 两类错误:未结束的字符串,非法字符 语法分析,单词流生成语法树 bison实现自底向上分析器,构造复杂广泛的LALR(1)文法 依据动作表解析字符串-----------------yyparse(),正常返回0,【状态栈、符号栈】 LALR(1)动作表----------------------y.tab.c 出错时yyparse()调用,并返回1--------yyerror() .output文件是LALR(1)预测分析表抽象化 ~~~ ###### 项目目录 ~~~shell lib:存放备份,生成一次就可以的文件,执行文件坏了,从这里拿去替换,提升执行效率 ~~~ ~~~shell linux: cifa#存放cifa分析输出程序 tinyc#存放词法、语法、中间、目标执行程序、结果 ~~~ ~~~shell tip:存放各种提示页面和相应md文档 ~~~ ~~~shell try:存放代码示例 ~~~ ~~~shell ui:操作界面、所有tinyc文件夹生成结果 ~~~ ~~~shell WINtools:flex、bison、nasm、gcc安装包 ~~~