
Fundamentals of Compiling
pangPython
任何事做上10年以上总会有起色
展开
-
编译原理学习
使用教材:清华大学出版社的编译原理第3版编译过程概述: 源程序->词法分析->语法分析->语义分析->中间代码生成->代码优化->目标代码生成->目标程序词法分析的结果是将源程序的字符流拆分成一个个的token; 语法分析的结果是产生语法单位,可用语法树来表示; 语义分析是审查源程序是否存在语义错误; 一个完整的编译器还包括表格管理和出错处理.原创 2016-03-02 14:14:39 · 686 阅读 · 0 评论 -
学习使用的PL/0编译器增强版PL/0plusplusCompiler(七)扩展repeat-until
有了(六)中扩展if-then-else的经验,之后的工作就好做了。 repeat-until的语法描述图: 比较类似与do-while的循环,但是这里的出口条件是满足条件时就跳出循环。POS1位置要有条件跳转。 1.更改关键字个数# define norw 16 /*关键字个数*/2.枚举符号表中添加repeat、until/*符号*/enum symb原创 2016-06-16 01:17:15 · 5888 阅读 · 0 评论 -
学习使用的PL/0编译器增强版PL/0plusplusCompiler(六)扩展if-then-else
要扩充else要修改编译器,使得编译时else可以通过语法分析和语义分析这两个过程。 PL0.h中 1. 修改关键字个数# define norw 14 /*关键字个数*/2 . 在枚举集合中添加else标识/*符号*/enum symbol{ nul, ident, number, plus, minus, t原创 2016-06-16 00:52:07 · 4208 阅读 · 7 评论 -
学习使用的PL/0编译器增强版PL/0plusplusCompiler(五)使用<>代替#不等于号
思路就是在检测小于号时检测一下如果后边为大于号就把当前的token组合识别为不等于号。/*词法分析,获取一个符号*/int getsym(){ int i,j,k; while( ch==' '||ch==10||ch==9) { getchdo; } if(ch>='a'&&ch<='z') { k=0;原创 2016-05-19 17:11:40 · 1054 阅读 · 2 评论 -
学习使用的PL/0编译器增强版PL/0plusplusCompiler(四)使用gdb调试PL0词法分析
默认已经把编译器编译成pl0c可执行程序了 1. 使用gdb把程序运行起来 gdb ./pl0c 2. 加断点 break getsym 意思是在getsym这个函数加断点 3. 加参数执行 r test.pl0 因为需要分析test.pl0这个源代码文件,所以需要这个参数 r是run 4. continue执行原创 2016-05-18 12:54:17 · 800 阅读 · 0 评论 -
编译原理一些术语
幂集、序偶、笛卡尔积、元组(来自离散数学)闭包、正闭包、*闭包(克林闭包)、空闭包规则、产生式、生成式、重写规则、候选式终结符、非终结符文法、0型文法、1型文法(上下文有关的)、2型文法(上下文无关的)、3型文法(正规文法) 推导、派生、规约、规范推导左部、右部 句子、句型 、规范句型短语、直接短语、句柄语法树(推导树)、语法分析树词法、语法正规式(正则表达式)自动机、DFA原创 2016-05-16 17:37:13 · 1972 阅读 · 0 评论 -
编程实现计算FIRST集和FOLLOW集C++之(三)处理候选式:把空加入非终结符的First集
之前删去了右部为空的候选式。现在要实现把空加入到当前非终结符的First集中。 主要使用了boost的string的有关算法,trim处理字符串前后的空格。string fzhongjiefu = line.substr(0,line.find("-")); trim(fzhongjiefu); preprocess.seekp(mark_原创 2016-05-25 22:31:38 · 2752 阅读 · 0 评论 -
编程实现计算FIRST集和FOLLOW集C++之(二)处理候选式:右部为空
之前处理了把右部有多个候选式的分割成了单独一行。 这其中第3、6行,候选式的右部为空,由求解First集的算法可知,此时可以直接把“ε”加入当前候选式左部非终结符的First集中。并且可以在操作的文件中删去这一行。算是预处理把。 实现思路就是,利用C++的fstream对象,设置打开文件的方式为读写(一般的操作是只能读或者只能写),每次处理一行候选式之前,记录当前的输入流的位置,如果当前的候原创 2016-05-25 07:14:56 · 4278 阅读 · 1 评论 -
编程实现计算FIRST集和FOLLOW集C++之(一)处理候选式:多个右部
当前目录下有这三个文件houxuanshi_processed.txt houxuanshi.txt main.cpphouxuanshi.txt的内容E->TE'E'->+TE'|εT->FT'T'->*FT|εF->(E)|id开始houxuanshi_processed.txt 内容是空的或者直接没有这个文件。 main.cpp#include<fstream>#incl原创 2016-05-24 17:42:06 · 5661 阅读 · 1 评论 -
学习使用的PL/0编译器增强版PL/0plusplusCompiler(三)加入“man” 功能
Linux中很赞的工具man,查看命令或者工具的帮助手册manual。 在PL0.h中声明help方法,void help();在PL0.c中实现help这个方法,/*显示帮助文档*/void help(){ printf("\n\nPL0 plus plus Compiler:\n"); printf("编译源码: pl0 test.pl0\n"); printf原创 2016-05-11 12:58:21 · 967 阅读 · 0 评论 -
学习使用的PL/0编译器增强版PL/0plusplusCompiler(二)加入支持命令行参数
每次程序运行后输入源码文件名不是很好,于是做了支持命令行参数的改进。大体思路:在main函数入口加入命令行参数,进入main后判断文件名是否为空,为空就退出,否则就继续编译。 在main的括号中加入int argc, char** argv在main第一行加入 /*如果没有在命令行中输入文件名会提示输入源码文件名*/ if(argv[1]==NULL){ printf("请原创 2016-05-10 20:22:31 · 1934 阅读 · 0 评论 -
学习使用的PL/0编译器增强版PL/0plusplusCompiler(一)源码及使用
一个计算机科学家做的C语言实现的一个比较简单的学习研究用的编译器,PL/0 Compiler。正在学习编译原理,所以自己修改一下。 这个编译器只有两个文件。PL0.c、PL0.h/*PL/0 编译系统C版本头文件 pl0.h*/typedef enum{ false,true}bool;# define norw 13 /*关键字个数*/# defin原创 2016-05-10 20:06:18 · 3320 阅读 · 3 评论 -
学习编译原理遇到的问题
1.在LR(0)分析中有一个结论:在LR分析工作过程中的任何时候,栈里的文法符号(自栈底而上)X1X2„Xm,应该构成活前缀,把输入串的剩余部分配上之后即应成为规范句型(如果整个输入串确实构成一个句子)。如何证明?原创 2016-06-17 17:46:06 · 993 阅读 · 0 评论