Skip to content
This repository has been archived by the owner on Jun 20, 2024. It is now read-only.
/ lang Public archive

An interpreter for the programming language written in Rust and Golang

Notifications You must be signed in to change notification settings

BreezeTeam/lang

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

80 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

lang

An interpreter for the programming language written in Rust and Golang

解释器的结构:

  1. repl循环(Read-Eval-Print Loop)

    交互式编程环境的顶层构建 循环用于读取用户输入的字符流,分行读取,输入至解释器中,完成整个语法解析和执行和过程后输出结果.

  2. 词法分析(lexer analysis)

    词法分析器读入组成源程序的字符流,并且将其组织为词素序列,每个词素形式如<token_name,attribute_value>。 词法分析器在编译器中负责读取源程序,因此他还会完成一些识别词素之外的其他任务 1.过滤掉源程序中的注释和空白(空格,换行符,制表符,以及在输入中用于分割词法单元的其他字符) 2.将编译器生成的错误与源程序的位置联系起来

  3. 语法分析(parser analysis)并得到抽象语法树(ast)

    通过 Pratt Parsing 进行语法分析 这是一种自上而下操作符优先级解析方法,是作为基于上下文无关文化和Backus-Naur-From 解析器的替代方案 当完成 语法分析后,我们会判断该语言的基本语法问题,并且构造一个ast树,该树由表达式(Expression)和语句(Statement)组成 树根即为 Program ast root node,它由语句列表组成

  4. 对象系统(object)

    在开始构建 我们 eval ast 解释执行器之前,我们首先需要定义我们的对象系统 该系统将解释的值对象和解释器编写语言(golang)的对象进行关联,并且通过定义合适的接口,来向使用语言的用户提供数据 简单的说,语义分析中需要对ast节点进行计算,我们会将计算结果存储在我们定义的对象系统中 例如,我们定义一个 integer 对象,当语法分析遇到 数字时,我们会将其转换为 ast 对象,在然后的语义分析中,deep_walking 对 ast 进行计算 将计算结果封装到 integer 对象中,并返回其引用 该语言主要有 int,bool,function,string,builtin,array,hash(for {"name": "Monkey"}),null,return,error(for eval statements errors)

  5. 语义分析(eval)

    通过对构建得到的ast进行 tree-walking 实现语义分析,并进行解释执行 通过构建一个eval 函数进行递归计算表达式,表达式的具体计算在go中实现

编译器: 是一种将源程序翻译为另一种目标语言编写的程序

解释器: 直接将用户输入的源程序,执行其中的操作并输出

虚拟机: 源程序=>翻译器=>中间程序=>虚拟机 将中间程序和输入一起交给虚拟机执行并输出结果

语言处理器: 源程序=>预处理器=>预处理后的源程序=>编译器=>目标汇编程序=>汇编器=>可重定位机器代码=>连接器/加载器=>目标机器代码

About

An interpreter for the programming language written in Rust and Golang

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published