函数的实现如下:public class FunctionDefine : Context { private Stack> m_parameterStack; public DataTypeInfo ReturnType; public Expression.Operand.Operand ReturnValue;...
表达式,最简单也最困难。各种算术、逻辑、赋值埋同函数调用,想想都头大如斗转星移山填海枯石烂。废话有云,根据Yacc规则,表达式由操作数及操作符构成。操作数有立即数、变量、函数调用及另一个表达式。操作符有一元、二元及三元操作符。惜乎SharpC不支持三元表达式。有两类特殊的操作数:指针及指针指示(Pointer indiction应该怎么翻译)。有一个特殊的操作符:sizeof。说其特殊...
2013-03-29 03:57 阅读(831) 评论(0) 这三种控制结构都必须结合上下文环境共同作用。看起来它们更像是一种标记。因此上,它们的实现也相当简单:public class Break : ControlFlow { public override void Print(int tabs = 0) { Debug.WriteLine(new string('\t', t...
2013-03-28 17:21 阅读(902) 评论(0) 鲜有解释器(或编译器)实现了switch控制。无它,唯复杂尔。SharpC将switch划分为两个部分实现:switch(表达式)和case。先看Case的实现,由条件值和执行部分组成:public class Case : ControlFlow { public Expression.Operand.Value Value; public...
2013-03-28 17:12 阅读(1265) 评论(0) 循环具有类似的结构:条件判断,循环体。其基类如下所示: public class Loop : ControlFlow { public Expression.ExpressionNode Condition; public virtual Block Body { get { return Ch...
2013-03-28 16:59 阅读(1085) 评论(0) 勿庸质疑,说到控制结构,首先会想到if。其实现应如下所示:public class IfThen : ControlFlow { public Expression.ExpressionNode Condition; public Block ThenClause { get { return Chi...
2013-03-28 16:47 阅读(1068) 评论(0) 出于对指针操作的支持,变量Variable需要模拟其在内存空间中的表现。每个变量都有个Address属性。参考Variable.Assign()方法,可知端倪:public virtual void Assign(Expression.Operand.Value value) { if (this.TypeInfo.IsPointer)...
2013-03-28 16:40 阅读(887) 评论(0) Context是构建语法树的基础,程序由一个个Context组成,比如变量(申明),语句,块,函数,控制结构等。看看Context类的Run方法,很能说明问题:public virtual void Run(Context ctx) { // 正在运行标记 IsRunning = true;...
2013-03-28 16:15 阅读(1661) 评论(0) 下面是测试程序的代码,该程序用于测试语法分析和运行。代码应该可以说明其功用了。using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Diagnostics;namespace...
2013-03-28 15:48 阅读(991) 评论(0) 根据分析,有以下类型:void,char,short,int,float,指针。关联到表达式的操作数,就有:Operand:操作数基类。Value:值类型。ValueOfPointer:指针类型。ValueOfPointerIndiction:指针内容类型。ValueOfVariableReference:变量引用类型。ValueOfFuncti...
2013-03-28 14:28 阅读(1144) 评论(0) 根据yacc脚本,可以看出,一个典型的C程序具有如下结构:1.变量申明(包括其初始化)初始化语句为:表达式。2. 函数(前向申明和函数体定义)函数由定义和函数体组成。2.1 定义定义的参数部分包含了参数定义,其为局部变量。前向申明仅有定义。2.2 函数体函数体为代码块。2.3 代码块代码块由语句和嵌套的代码块组成。2.4 语句语句由变量申明、以;结尾...
2013-03-28 09:49 阅读(1313) 评论(0) 先看看依赖图: 整个系统这样设计:SharpC:是对整个实现的包装。Memory:是对内存系统的模拟。Grammar:包含分析器和解释器。解释器包括表达式,函数,类型系统。 程序的执行逻辑主要由表达式和控制结构实现。 ShaprC的类型系统如下图,类的名字很好的解释了这个系统: 控制结构的类图如下: 再看函数: 下面是...
2013-03-27 15:03 阅读(954) 评论(0) 虽然没有使用标题里的两个著名工具,但我们还是可以参考一下。在制作过程中,为了了解两个工具,偶制作了yacc和lex的脚本,并安装了Bison和Flex。 先看yacc的脚本:利用该脚本生成的语法分析程序会将指定的源代码文件读取分析后打印,偶用它来测试自己编写的语法规则。%{#include #include extern FILE *yyin;ext...
2013-03-27 14:32 阅读(2552) 评论(0) 在维护新建对象的时候,利用对象休眠的闲暇,写了个习作。咸盐少许。通常,编译原理或编译技术都会建议使用yacc或lex来实现语言、公式的解释器或编译器。鉴于实现一个语言编译器或解释器的困难,大多数猿类都会使用这类工具。不过,本文穿越到了工具出现以前的时代,同时又开启了金手指:带了c#、Flex和Bison。既是习作,故使用c#手工打造了一个简单的c语言解释器,而并未使用Flex和Bison。...
2013-03-27 14:13 阅读(1744) 评论(0)