
Interpreter
skyf**er
北工大计算机本科生
展开
-
flex+bison实现玩具计算器
参考flex与bison++中文版的例3-1一共需要5个文件1. fb31.h 头文件2. fb31.l flex规则3. fb31.y bison规则4. fb31func.c 具体函数的实现5. Makefile 编译规则fb31.h//fb31.h 头文件extern int yylineno;void yyerror(char *s, ...);struct ast{ int nodetype; struct ast *l; struct ast *原创 2020-05-09 09:47:00 · 704 阅读 · 0 评论 -
用rust写一个玩具解释器12(eval&object)
好像没啥可写的, 好吧是我太菜了:(eval函数中绝大部分都在eval套娃.那么套娃递归的终结符在哪里呢?是最基本的true,false,数字,字符串...GC: 自己太菜了,不会以后肯定会写的, 奥里给!object该语言不是面向对象而是基于对象其实就是结构体&枚举,如何添加数组对象假设现在我们不支持数组, 那如何添加数组呢?首先明确数组如何创建,赋值,取...原创 2020-03-04 13:23:24 · 329 阅读 · 0 评论 -
用rust写一个玩具解释器11(eval)
今天终于进入到了eval的环节:)我们的玩具解释器也快进入尾声了.我们现在已经有了ast了, 如何获取到值呢?下一步是编译还是直接计算呢?直接计算吧.如何计算呢?我们采取遍历树的方式, 即在树上行走的eval, 还是采用递归的.一般听到递归就会谈虎色变, 但是递归却是用有穷来描述无穷的法宝.程序中递归一定要有一个终止操作, 要不然就是死归了.而且最终一定要到终止操作上.首先看我们...原创 2020-03-01 17:22:41 · 445 阅读 · 0 评论 -
用rust写一个玩具解释器10(parser)
介绍完中缀和前缀表达式那么今天就把parser的代码全部贴出来可跳过use crate::ast::ast::ASTNode;use crate::ast::ast;use crate::mylexer::lexer;use crate::token::token;use std::collections::HashMap;pub enum Pri { LOWEST, ...原创 2020-03-01 13:02:13 · 366 阅读 · 0 评论 -
用rust写一个玩具解释器9(parser-中缀表达式)
复杂警告⚠重要的是操作符之间的优先级1.具体优先级大小,和支持的运算符pub enum Pri { LOWEST, ASSIGN , // 赋值 EQUALS , // ==, != LESSGREATER , // < ,> SUM , //+,- PRODUCT ,//*,/ PREFIX , // !,- ...原创 2020-02-25 21:02:14 · 309 阅读 · 0 评论 -
用rust写一个玩具解释器8(parser-前缀表达式)
前一篇文章讲了如何解析let与return,那么今天就讲如何parse前缀表达式.1.前缀表达式都包含什么变量名数字"!"感叹号"-"减号逻辑值 true,false"("左小括号if关键字fn关键字字符串"{"左大括号"["左中括号 p.prefix_parser_fns.insert(token::IDENT, Parser::parse_ide...原创 2020-02-22 18:41:03 · 1154 阅读 · 0 评论 -
用rust写一个玩具解释器7(parser之let&return)
整个parser文件有550行, 但是大部分是有重复内容的.所以不用担心.对比于刚从SICP学的lisp, 相比来说lisp的parser是不是简单一些, 但是总的工作量是一定的, lisp把parser的心智负担给了代码编写者和阅读者.而其他大部分语言把parser的心智负担给了语言发布者.若代码规模稍稍增长, 那么lisp的方式就不够经济. 就比如写rust的时候,一天想代码怎么写,一天写...原创 2020-02-20 13:56:41 · 472 阅读 · 0 评论 -
用rust写一个玩具解释器5(ast-1)
ast介绍抽象语法树的节点#[derive(Debug,PartialEq,Clone,Eq,Hash)]pub enum ASTNode{ Program(Program), LetStatement(LetStatement), //let name = value BlockStatement(BlockStatement), // {} Boolea...原创 2020-02-16 20:59:25 · 557 阅读 · 0 评论 -
用rust写一个玩具解释器5(parser&ast-0)
parser与ast先介绍parserparser干什么?将lexer的输出的token组织为ASTAST是啥?Abstract Syntax Tree(AST)-抽象语法树.那AST是二叉树吗? 大部分示例都画为二叉树.但是树其实就是嵌套的list,为啥一个节点不能有多个儿子.不过在我们组建AST过程中很少用到多叉树.然后parser如何工作呢?emmm…我们先区别介绍pa...原创 2020-02-11 13:46:58 · 537 阅读 · 0 评论 -
用rust写一个玩具解释器4(完整的lexer)
完整lexer介绍use crate::token::token; //导入tokenconst CHAR0: char = 0 as char;#[derive(Debug,Clone)]pub struct Lexer { input: String, position: usize,//当前读取的字符 read_position: usize,//下一个字...原创 2020-02-11 12:25:12 · 385 阅读 · 0 评论 -
用rust写一个玩具解释器3
项目目录项目地址画质有点渣其实不应该创建太多的包,因为里面其实只有一个有效文件(mod.rs和test.rs算是辅助) . 所以说目录可以更简单一些.token在上文中提到了把token看为字符串, 而其大致分为两种.我们预先定义的比如 +,-,*,/,if,return,fn和let等留给用户的比如: 变量名,整数//token/token.rs//不想下载第三方包,...原创 2020-02-06 10:00:51 · 373 阅读 · 0 评论 -
用rust写一个玩具解释器2(lexer)
词法分析器输入: 由字符(ASCII码)组成的字符串输出: token任务: 读取输入, 并且按规则输出tokentoken: 想简单点, 就是一个字符串和它的类型(比如说关键字, 变量名,非法字符串…)所以说我们现在需要, read_char, skip_whitespace和next_token函数以及当前字符ch和下标left(position),right(read_posi...原创 2020-02-05 21:20:18 · 548 阅读 · 0 评论 -
用rust写一个玩具解释器0
前言假期闲来无事, 看了Thorsten Ball的Writing An Interpreter In Go, 他还有一本写编译器的暂时没看, 跟着书上的代码写了一遍, 想着用rust重写一遍, 现在正在写eval部分.Writing An Interpreter In Gogo&rustgo我对go的感觉如它宣传的一般, 21世纪的c语言, 用go写了一个小web程序, 感觉比...原创 2020-02-04 20:38:53 · 329 阅读 · 0 评论