
编译原理
ARTELE
爱好计算机
展开
-
自制编程语言(13)---中间码---二元表达式加法
0.简介二元运算有很多,这里只用加法来举例子。1.中间变量在获得二元表达式的时候,要有中间结果在存储,所以要暗中处理中间结果。一下是二元表达式计算中间代码的方法。operand BinaryExpression::evaluation(std::vector<Quaternion>& stms, Memory& memory, NameTable& table){ operand result; operand rightValue = rig原创 2020-05-18 17:24:56 · 333 阅读 · 0 评论 -
自制编程语言(12)---中间码---赋值
0.简介赋值操作可以认为是移动操作,类似汇编里mov1.赋值这里赋值就是将一个变量的值给另一个变量,由于具体的值获取要在执行期间才可以获取,所以赋值生成的代码都是用地址来进行访问赋值。2.实现先修改一个地方。//变量记录表,栈型class NameTable{public: NameTable() {} ~NameTable() {} //类别,数值,地址,变量名字 std::vector<std::tuple<int, int,int, std::str原创 2020-05-18 15:10:40 · 344 阅读 · 0 评论 -
自制编程语言(11)---中间码---变量声明的中间码
0.简介变量声明需要有中间码来操作,这里设计成入栈的操作。1.实现struct operand{ operand(){} //类型,数值,数值类别(数值,地址) operand(int t,int n,bool addr):vaild(true), address(addr),num(n),type(t){} bool vaild = false; bool address = true; int num; int type;};enum OP{ ADD, ASSIG原创 2020-05-17 21:37:04 · 410 阅读 · 0 评论 -
自制编程语言(10)---辅助虚拟环境---内存
0.简介在生成中间码之间,要设计好一个运行内存模型。这里直接就用数组来代替内存空间。1.内存class Memory{public: Memory() { //初始化内存 memory = new char[8192]; } //生成中间代码用的地址分配计数器 int address = 0; //内存空间 int esp=0; int ebp = 0; int malloc(int size) { return address+=size; } cha原创 2020-05-17 18:45:24 · 286 阅读 · 0 评论 -
自制编程语言(9)---语法分析---函数声明
0.简介前面写了那么多,现在我们可以支持函数声明了。1.函数声明//声明1int fun(int a,int b){ ...}//声明2int fun(int a,int b);int fun(int a,int b){ ...}我打算支持这两种声明格式。先设计函数表达式类//代码块表达式class CodeBlockStatement : public Statement{public: CodeBlockStatement(int _l原创 2020-05-12 18:21:53 · 384 阅读 · 0 评论 -
自制编程语言(8)---语法分析---数组赋值
0.简介数组也和变量一样,需要有直接赋值操作。1.数组赋值其语法如下int a[3]={1,2,3};这里主要对大括号里的内容进行处理,至于个数要到后面就解析的时候处理。2.实现//数组声明语句class ArrayDeclareStatement :public Statement{public: ArrayDeclareStatement(int _line, int _column) :Statement(_line, _column) {} //数组类型原创 2020-05-12 01:11:07 · 392 阅读 · 0 评论 -
自制编程语言(7)---语法分析---变量声明赋值
0.简介前面有了变量声明,我希望还能支持变量声明后直接赋值的操作。1.声明赋值其语法样式如下int a = 10;2.语法实现//变量声明语句class VariableDeclareStatement : public Statement{public: VariableDeclareStatement(int _line, int _column) :Statement(_line, _column) {} //类型 Token type; //类型名字 st原创 2020-05-11 21:32:51 · 422 阅读 · 0 评论 -
自制编程语言(6)---语法分析---分号
0.简介习惯了C语言和C++编程,一句话结尾没有分号觉得很别扭,所以这里同样也实现分号结尾。1.合格的分号语法;int a;int a;;以上都是正确的分号。2.实现首先设置一个 专门检测分号的函数void Parser::semicolon(){ //检查是否为分号 if (getToken() == TK_SEM) { //吃掉分号 while(getToken() == TK_SEM) pushNextToken(); } else {原创 2020-05-11 20:35:46 · 402 阅读 · 0 评论 -
自制编程语言(5)---语法分析---报错处理
0.简介今天比较累,所以就写点简单的。1.报错当我们的代码出现错误的时候,编译器应该能识别到并且可以反馈给我们,我们需要在语法分析或者是词法分析的一些指定位置安插一些报错语句,当遇到了错误,然后返回错误信息,这样我们就能根据错误信息来修改代码。2.错误类型根据目前编译器所有的功能,有以下几个地方可以识别出错误数组缺少中括号数组声明的下标不是确定的数字表达式语句无效声明标识符错误设计一个类,专门负责错误输出。//错误代码enum ErrID{ MISSING原创 2020-05-10 23:46:32 · 924 阅读 · 0 评论 -
自制编程语言(4)---语法分析---数组声明和访问
0.简介数组我觉得不太好管理,所以先把这个问题解决掉。1.数组声明数组声明语法如下。int a[10]其中包含类型、数组名、元素个数新建一个数组声明语句//数组声明语句class ArrayDeclareStatement :public Statement{public: ArrayDeclareStatement(int _line, int _column) :Statement(_line, _column) {} //数组类型 Token type;原创 2020-05-09 23:27:50 · 397 阅读 · 0 评论 -
自制编程语言(3)---语法分析---赋值语句
0.简介本次实现赋值语句。1.赋值语句a = a + ba = 9以上语句均为赋值语句,这里引入了许多表达式分析。2.一元表达式先从一元表达式开始。std::shared_ptr<Expression> Parser::parseUnaryExpr(){ //什么情况下是一元表达式 Token token = getToken(); //有符号前缀的情况下 if (token == TK_MINUS || token == TK_LOGNOT || t原创 2020-05-09 19:29:20 · 1256 阅读 · 0 评论 -
自制编程语言(2)---语法分析---变量声明语句
0.简介先从比较简单的语法解析开始,CScript打算设计成强类型语言,所以所有变量都要先声明才可以使用。1.声明语句增添了AST树class AstNode{public: int line, column; AstNode() {}; AstNode(int _line, int _column) :line(_line), column(_column) {} //分析语法后生成中间码 virtual operand evaluation(std::vector<原创 2020-05-09 15:47:40 · 994 阅读 · 0 评论 -
自制编程语言(1)---词法分析
0.简介本次编写词法分析器,形式为代码讲解。1.词法分析词法分析我了解的有两种,一类是状态机,根据遇到不同的字符转换到不同的状态来决定下一个字符应该是什么,另一种就是直接写词法分析,简单的if判断。前者实现的代码很少(可参见本人博客编译原理栏目下),,但是需要一个状态转换表,随着词法分析的内容变多,这个表格也会很大,比较难维护,后者虽然代码写的多一些,但是逻辑上容易理解,也容易修改。以下代码在别的教程中有所参照,但是自己改编而成,本系列部分思想来自于这里,喜欢的可以去看看,跟着学还是有所收获原创 2020-05-09 13:26:33 · 650 阅读 · 0 评论 -
自制编程语言(0)---介绍
0.简介前一段时间在网上买了个课程,关于脚本解释器的,一直希望自己也能写出一个来,所以在学习了之后,我也开始写,之前已经写的差不多了,但是由于最开始的原理出了点问题,所以我只好重写,并且在这里记录重写过程。1.编程语言C语言,C++,这个属于编译形语言,直接将文本转换成二进制,我先将我的这个语言叫做CScript的,是一种语法类似C语言的脚本,脚本语言没有直接被翻译成二进制,而是直接解析文本(我最开始是这么写的),现在我打算转换成中间代码之后再运行,因为这样做好多东西容易不少。2.性质本原创 2020-05-09 13:15:23 · 985 阅读 · 0 评论 -
编译原理---递归下降法---文法设计---LL(1)
时隔这么久,我又回来更新博客了。编译原理这里本人就是做多少更新多少了,不定期更新,因为时间有时候比较紧,所以就不能按时更新了。今天看了一下语法分析,要是有需要词法分析的小伙伴们可以在等一等,很快也会更新过来。文章中不免有用词不当的地方,谢谢指正。 今天我们学习一下语法分析的LL(1)文法,LL(1)文法不是二义性的,也不是左递归的,我们要做确定的自顶向下语法分析,那么当给...原创 2018-11-07 10:36:38 · 2210 阅读 · 0 评论 -
编译原理---词法分析
词法分析有好多方案,这里我只介绍使用状态机的方案。对于状态机是什么,以及是什么原理,这篇博客不做详解,读者可以查阅相关资料来补充相关知识。这里主要讲怎么利用相关原理设计词法分析的状态转移表和实现算法。首先,创建一个状态转移表 举个例子,假如当前输入的字符是'1',那么先设置状态是1,也就是上面表中的整数,然后在整数状态(或者是状态1)下,又遇到了下一个字符'.',...原创 2018-11-07 21:31:19 · 647 阅读 · 0 评论