编译器

java

chlang 初版

关于chlang 这是个玩具解释器,通过完成它学习了许多关于编译器前端的知识点 github地址 本来这是个c语言项目,由于c语言实现实在过于繁琐,遂弃坑转为java,采用maven的项目管理结构 本语言主要参考了《自制编程语言》、c4的源代码 本文更新于2017.06.21 词法分析 词法分析器所在代码 主要有三个java文件构成,不讲一些自动机相关知识,默认已知 TOKEN_TYPE.java 1. 主要描述符号类型,带有RW开头的表示Reserved Word,也就是保留关键词 2. 最早期的开发比较简单,并没有 '>=' 这类的关系运算符,不会跟'='冲突产生太多的lookhead,这一部分是之后才加上的 3. 语言中只支持两种基础数据类型,整型(int)和字符串(string),当然为了实现闭包,还有函数这个数据类型,但不在这里体现 TOKEN.java

By chainhelen
语言的流程控制

编译器

语言的流程控制

问题 最近在写一个解释器,碰到一个关于控制流程问题,有感而发 起初我按照bnf范式写了一堆生成抽象语法树的代码,在eval.java中准备从tree root出发进行遍历计算每一个表达式(解释语句)。其中有一个核心函数recursionEvalAstNode每次递归传入每个节点(的子节点)。所以函数这个参数就是树上的节点parentAstNode。那么问题来了 包含一些控制流程的语句(break、continue、return,但if不是很明显) 比如说的return statement,一旦执行到这里,就应该退回wrap-function执行的地方,并把返回节点interpret result(可能是含有子节点的expression节点)存储在栈或者寄存器里"带出去",另一方面上叙采用的是用递归计算方式,return statment的同级 next sibling node还在上一层的递归里面呢,怎么告诉上一层它不用算了 图形结合 没有图!!! 题外话 这里可以看到,我在设计recursionEvalAstNode其实只想到了context-fre

By chainhelen

c语言

编译clang

环境 windows10 vs2015update3 community版 cmake3.7.2 Python 3.5.3 GnuWin32 tools llvm4.0源码 安装过程 首先安装vs2015updaate3 community版,双击iso镜像文件,win10系统自动挂载,在虚拟镜像里面双击vs_community.exe,选择默认安装即可 python、cmake安装过程比较简单,但是确保安装完成后都在环境变量PATH里面 唯一不一样的地方是我并没有安装GnuWin32,我装了codeblock(默认有mingw),然后把lib,include,bin目录都加在环境变量PATH里面,接在再添加了环境变量include,lib 下载llvm-4.0.0.src.tar.xz源码,改名llvm,解压作为源码根目录 下载cfe-4.0.0.src.tar.

By chainhelen

js

js 四则运算解释器

流程 词法分析 这里不讲那么复杂的正则表达式、DFA和NFA(后面的blog再介绍),或者各种证明啥的. 毕竟我们只需要写一个四则运算的解析器 我们的要写的东西,会不断地匹配输入的每一个字符流 而我们输入的字符流类型分为几种: '+', '-', '*', '/'和数字 将其转化为token流,由于js动态语言的灵活和我们程序很简单 我们只需要用变量token就可以存下来字符流的信息,无需为token定义一个复杂的类 详见next()函数中,对每一个类型的取值   语法分析 BNF范式 先讲一下,BNF范式 BNF是描述编程语言的文法。自然语言存在不同程度的二义性。 这种模糊、不确定的方式无法精确定义一门程序设计语言,必须设计一种准确无误地描述程序设计语言的语法结构,这种严谨、简洁、易读的形式规则描述的语言结构模型称为文法 比方说,具体看一下BNF对应的一些产生式 左侧都是些非终止符,右侧可以是终止符(对应词法里面的符号流)和非终止符的结合 例如上叙非终止符B是由"y"字符构成的,C由两种方式中的一种构成

By chainhelen