念心科道尊
时间同腐败是一回事。意料不到的东西以意料不到的方式变化,任何人都无从知晓。
展开
-
【fun】超级精简的编程语言定义
前言你知道吗,在《编译原理》的附录上,有一个简单的java实现的编译器前端,由源码生成三地址码!虽然我不会去写java这种辣鸡语言就是了,但是我看到其中词法分析器真的好简单,比我做的suatin-lexer用正则表达式分割的还要简单啊。定义token//token#define space 0 //空格或者\t#define eol 1 //\n#define eq 2 //=#define lt 3 //<#define gt原创 2021-06-02 00:03:55 · 236 阅读 · 0 评论 -
Demllie【5】>由AST抽象语法树到生成字节码
前言在没有AST抽象语法树的时候,直接迭代返回值就计算完了,有了AST抽象语法树后,值放在树节点里,在遍历的时候返回运算结果。再抽象一下,遍历的时候也不计算,而是生成字节码放入文件里,等后面用虚拟机处理字节码时运算!!!前面的文章Demllie>做一个Toy语言编译器,随便玩玩Demllie>小型词法分析器,其实就是循环判断Demllie>编译语言实现的核心问题,就是这里不明白让我白白写6000行垃圾Demllie>由迭代法next_term_factor_expr来构造AST抽象语法树修改v原创 2021-01-05 09:35:37 · 538 阅读 · 0 评论 -
Demllie【2】>小型词法分析器,其实就是循环判断
#include <iostream>using namespace std;int main() { FILE* file; int a = fopen_s(&file,"test.txt", "r"); if (a != 0) { cout << "文件打开失败!" << endl; return 1; } char c; int state, num = 0; while ((c=getc(file))!=EOF) {原创 2021-01-04 20:45:29 · 233 阅读 · 0 评论 -
Demllie【1】>做一个Toy语言编译器,随便玩玩
代码运行在VS2019中,命令行参数用下面方法添加在compiler.cpp旁建一个main.txt文件夹,写一段代码。#include <iostream>using namespace std;int main(void) { cout << "hello,demllie" << endl; return 0;}运行SB编译器//compiler.cpp#include <iostream>#include <string原创 2021-01-04 05:29:25 · 462 阅读 · 0 评论 -
Demllie【4】>由迭代法next_term_factor_expr来构造AST抽象语法树
命名规范去年做suatin-lang项目时,为了避免命名冲突和规范得让自己舒服点,结果各种标识符名称越来越长,越来越臭, //解释器运行的三个阶段 enum SuatinRunTimeType { SuatinRunTimeType_Lex, SuatinRunTimeType_Parse, SuatinRunTimeType_Interpret }; //cannot change the sequence enum SuatinTokenType { SuatinToke原创 2021-01-05 08:49:18 · 354 阅读 · 0 评论 -
【全代码】《基于C语言自制编程语言》词法分析器
——至于其他特点我忘了,还记得的就是Demo中部分函数命名很简单、简单到与其他库函数产生冲突了。。。。原创 2020-06-19 22:23:46 · 1079 阅读 · 1 评论 -
Demllie【3】> 编译语言实现的核心问题,就是这里不明白让我白白写6000行垃圾
前言核心问题就是分析时的迭代,因为不懂怎么迭代,我白白写了好多垃圾。下面做一个计算器,弄明白这个东西。Token定义typedef enum { NIL, ADD, SUB, MUL, DIV, MOD, NUM, LB, RB}TokenType;typedef union { char c; double v;}Var;class Token {private: static int counter;//类变量,不能再此处初始化 int num;原创 2021-01-05 02:01:49 · 391 阅读 · 2 评论 -
【语言定义】《自己动手制作编译器、链接器》中的simple c语言定义
前言本来想看《自制编程语言,基于C语言》,但是没有拿到手的电子书只有目录和两个章节,所以只能看《自己动手制作编译器、链接器》。这本书听说有些bug,其实无所谓了,一般的书上都找的出问题,就算是“大国重器”的教材书中也有打印错误。这本书中作者实现了一个simple c,我做这个项目是为了之后做别的语言打下基础,所以我这门在simple c上修改的语言就叫kic了!kic语言是c语言的子集...原创 2020-04-26 11:54:33 · 557 阅读 · 0 评论 -
lang:使用BNF范式设计一个文法
前言BNF范式是一种描述编程语言的数学方法,可读性接近自然语言。...原创 2019-11-09 19:28:14 · 1079 阅读 · 0 评论 -
自制编程语言应该按编译原理来吗?
走野路子还是走正道原创 2020-03-02 17:46:21 · 297 阅读 · 0 评论 -
编译原理复习,积累语言经验
0型文法设 G=(VN,VT,P,S)G =(V_N,V_T,P,S)G=(VN,VT,P,S),如果GGG的每个产生式α→β\alpha \rightarrow \betaα→β 都满足 $\alpha $1型文法2型文法3型文法原创 2020-04-21 20:48:00 · 362 阅读 · 0 评论 -
编译原理复习,掌握自动机
前言自动机就是作用在词法分析中的识别器,都是一个一个符号进行处理的,输入的是符号串,输出的是单词串!之前做自制语言suatin时直接交给正则了,这次自制语言kiana要自己动手做词法分析器了...原创 2020-04-24 11:57:22 · 626 阅读 · 0 评论 -
【编译原理】做了一半的LR(0)分析器
我们的火,要把世界都点燃——《龙族》原创 2022-07-03 05:43:13 · 110 阅读 · 0 评论 -
【i think】【2】shell 和命令行到底怎么才好看,其他语言(python,ruby,lua,julia)命令行样式
只是无聊写着一篇,有一些后来的简单想法,当时没有考虑到。比如不需要用scanf读取,而是自己用读取单个字符的函数读取,这样能吞掉回车,让shell显得更加高级!原创 2022-05-03 01:18:33 · 1185 阅读 · 0 评论 -
【i think】【3】打印控制台logo
julia语言logo _ _ _ _(_)_ | Documentation: https://docs.julialang.org (_) | (_) (_) | _ _ _| |_ __ _ | Type "?" for help, "]?" for Pkg help. | | | | | | |/ _` | | | | |_| | | | (_| | | Version 1.5.3 (2020原创 2021-05-23 09:08:30 · 631 阅读 · 2 评论 -
【i think of 】【2】python-like类语言的预编译器
前言本来想读取一行字符串,然后遍历处理。但是读取的时候本身就遍历过一遍了,还有用strlen求char数组长度时,也遍历一遍。所以这些函数都不能用。不能用strlen,那就不要用char数组,而是定义新的数据结构,有零长数组、字符长度、字符最大长度。//不定义成typedef,因为后期结构体多了后会很乱!!!struct ostring{ size_t maxl;//size_t = unsigned int size_t l; char s[0];};不能用fgets。读取一行原创 2021-05-22 04:14:13 · 216 阅读 · 2 评论 -
【i think of】【5】新的lexer,花了好多时间
前言之前的预编译器已经将行代码格式化了,缩进级数变成了\t的个数,连续的空字符变成一个空格。所以,遍历行代码字符串分割token就很简单了。定义tokentoken不只是运算符号,还可以是关键字、字面量。字面量指数字、字符串、标识符。其中标识符指变量、函数名等。之前我都把函数名和其他名字统称为变量名,但是后面可能会区分更严格,所以不这么做了。越到后面越难改,一改就要改很多地方。有时只是一时冲动,改完后又要改回来。/* token(116) := op symbol(55) + lite原创 2021-06-01 20:22:59 · 175 阅读 · 0 评论 -
【i think of】【3】shell改版,增加了一点功能
在乎也好,不在乎也罢,都不要欺骗自己,战胜情绪跟战胜敌人一样,首先你得承认它的存在——《死人经》原创 2022-05-03 05:17:09 · 318 阅读 · 0 评论 -
【i think 】【1】E-Bnf设计 —— 谈谈以前和以后
除了EBNF外,描述语法的方法有很多,比如正则,比如一些中级中间语言等。每种描述方法都有缺点,别的不说就拿EBNF举例子,他难以描述对齐和退格这种特性,但是python的这种特性让程序特别简洁,我对这个用对齐划分block的特性,从厌恶到喜欢。EBNF难以描述,所以以后也需要多接触点别的方法,用不同的方法描述同一种,看看能不能相互补充完整。...原创 2022-04-29 17:49:03 · 1218 阅读 · 0 评论 -
【i think of 】【1】语法设计,懒得写BNF,只有例子
前言制作的第三个语言了,虽然说前面都在小打小闹。前面的经历让我明白了,如果只想做个简单的语言的话,不用学什么编译原理,自己弄弄就出来了。但是在涉及LR分析,又递推有归约的时候,就必须认真学习编译原理了。什么虚拟机、GC、优化,以我的水平碰都碰不到一年多了还在分析阶段的前端例子用Python的语法高亮看看好不好看。不用大括号或者end关键字划分语句块,而是用缩进。python中的缩进不固定大小,只要缩进就好。有时一个代码块中,其他缩进为3个空格,有一行缩进是4个空格,根本找不到哪里有问题!所以,这原创 2021-05-18 11:10:04 · 255 阅读 · 1 评论 -
【zhangqi-lang】制作新语言的需求
作者:Demllie时期:2021年1月1日回顾:去年花了三个月做的编程语言suatin-lang,仅仅实现了判断和循环就放弃了,主要的原因是本人水平太差,没有搞懂词法分析和语法分析中的核心问题——不会迭代生成AST,至于后面的代码优化、类型判断、虚拟机等需求就不需要提了。虽然suatin-lang只能算是个计算器,但是编译语言的相关特性还是实现了很多的,我想着这足够让我有自信去往下做了。但是,事实上,我没有一点成就感,这东西是个残次品,给别人吹自己做了个编程语言也没办法秀出来,因为的的确确没有实际用原创 2021-01-01 22:43:46 · 283 阅读 · 0 评论 -
【zhangqi-lang】【9】文法设计
zhangqi-lang文法program := chuck{,chuck}chuck := block|statmentstatement := ( vardef_stat | assign_expr | expression | funccall_stat | return_stat ) endstat原创 2021-02-05 22:55:08 · 460 阅读 · 1 评论 -
【zhangqi-lang】【5】变量定义let\var\const ——后面删掉了var,增加了static
Parser.cpp ... const char* keyW[] = { "import","from","as","if","elif","else","end","in", "function","def","while","do","until","return","break","next","exit", "redo","reloop","reboot","True","False","Nil","NaN","Inf","Undefined", "local","switch"原创 2021-01-27 21:48:45 · 373 阅读 · 0 评论 -
【zhangqi-lang】【3】简单抽象语法树,只有加减乘除取余取模和小括号
前言关于switch体的设计,迭代体的设计等,太让人头疼了。先把简单的写完,再去一个个基本的加上去。比如先针对变量和关键字的区分,然后设计动态可变的变量和变量池,要考虑全局和局部,考虑字符串转哈希。定义简单节点//Node.h#pragma once#ifndef _NODE_H_#define _NODE_H_#include"Utils.h"namespace zhangqi { //节点类型定义 typedef enum { //N_在开头 N_Node, N_Tre原创 2021-01-12 15:23:52 · 262 阅读 · 0 评论 -
【zhangqi-lang】【7】运算符消除左递归写法,将关键字并入token,重新设计Node
之前项目中的Parser没用了,现在改了Node设计,之前关于Node的AST构造都变成垃圾了(其实本来就是,,,,就是因为太差所以好久没碰了)——修改后的Node简单多了,之前Add,Sub这种都分两个类,其实区别只有一个符号而已,差别太小、功能相似的应该放在一个类里!!!原创 2021-02-04 09:08:00 · 193 阅读 · 0 评论 -
【zhangqi-lang】【4】扫描两遍,把AST构造从Lexer中分离出来 + 制作变量池
变量和变量池 /*---------------------------数据类型定义------------------------------*/ /* Id标识符,包括var变量,kw关键字 var变量包括num数,function函数\enum枚举,type原型等 */ //所有的数据类型 typedef enum { // _t在后表示类型 NONE_t, //基本数据类型 INT_t, //整数 NUM_t, //浮点数 COMP原创 2021-01-26 23:11:17 · 196 阅读 · 0 评论 -
【zhangqi-lang】【6】四则运算新的解析方法
原来如此比之前的解析方法好多了,之前还需要先用temp保存当前token判断一下temp是不是运算符next()右边迭代返回右值判断temp运算符类型,分类型进行计算移动temp到当前token,返回第二步 \; \;下面的解析方法是先判断当前token,进入各情况next()用传入的参数——左值与迭代返回的右值进行计算并返回#include <iostream>#include <istream>using namespace std;原创 2021-01-29 21:53:29 · 196 阅读 · 0 评论 -
【zhangqi-lang】【10】修改了Node类设计,解析了if,elif,else
前言Node设计修改的部分 typedef enum { BodyType_NORMAL, BodyType_BEGIN, BodyType_END, BodyType_ELSE }BodyType; class Body_Node : public Node{ protected: vector<Node*> body; BodyType t; public: Body_Node() { t = BodyType_NORMAL; } Body原创 2021-02-10 23:40:31 · 263 阅读 · 0 评论 -
【zhangqi-lang】【13】重学编译原理!新语言大改版!
重学编译原理在进行语法分析时,越来越感觉自己的编写的代码都是垃圾,没有复用的过程来处理不同但是类似的语法。之前还想《编译原理》我学过的啦,学到FOLLOW左右就没有学啦,反正写的时候也不用啦。都是自己太年轻,说些胡话。打脸还是自己来打!语法分析时,一直以为用LL就行,但是按照ruby设计的循环,就需要规约才行!(1..20:2)->each |i|: print(i)end语法分析的方法有LR分析法,特别复杂,去年我还没学到这就放弃了,毕竟疫情虽然在家,但是课还是很多的,虽然都是垃圾原创 2021-03-20 14:32:05 · 360 阅读 · 2 评论 -
再谈编程语言设计和实现
...原创 2021-02-13 15:31:48 · 2496 阅读 · 7 评论 -
【zhangqi-lang】【2】把Token放在一个容器里
前言因为之后会扫描几遍,所以放在一起比较方便!!!0宽数组在匹配标识符和字符串的时候,只设置了开始和结束标志,然后一个个字符打印到控制台,想要变成一个字符串的话就需要一个柔性可变的字符数组。对于文件名 g_file和一行的内容 g_lineContent这些,设置成定宽的就行了!为什么不用C++的string?因为之前项目suatin-lang用过,很方便,但是从std::string字符串到char字符或者char数组需要个转换,所以还是全用char比较清楚。自定义0宽数组这个算是Uti原创 2021-01-11 00:10:44 · 225 阅读 · 0 评论 -
【zhangqi-lang】【12】解析了函数
函数设计/* export function say(str:string,a,b,c,...) -> bool: print('hello,world') return false end let a = function(a:int,b,c:float) -> string: print('hello') if b : return 'true' 'end return 'demllie' end */ class Func_Node : public原创 2021-02-19 22:49:02 · 193 阅读 · 1 评论 -
【zhangqi-lang】【1】词法分析器
..........原创 2021-01-10 10:07:12 · 422 阅读 · 0 评论 -
【zhangqi-lang】【8】添加优先级,允许多个not或者多个!相连
优先级(由低到高)orand xor xnor nand nornot< > <= >= == (值等于) ~=(值不等于) ===(类型和值都等于) ~ ==(类型和值都不等于) <=>(比较)+ -* / % %%^& | ! << >> <<< >>>factor函数声明 //1. Node* expr_logic_or(); Node* expr_原创 2021-02-04 11:30:20 · 187 阅读 · 0 评论 -
【zhangqi-lang】【11】解决了数字状态机的BUG,设计了Range,解析了循环
Lexer错误数字状态机有错误,浮点数有小数点,但是操作符点点和点点点也有,当数后面有点点或点点点时,第一个点会被数字状态机吸收!修改后 /*------------------------------数字状态机----------------------------------*/ if (flag_syn == 0 || flag_syn == 2 || flag_syn == 4) { if (c <= '9' && c >= '0') {原创 2021-02-13 11:36:12 · 260 阅读 · 0 评论 -
[Suatin]不学编译原理做编程语言17——公布最后一个项目——用VSCode+mingw编译CPP项目(多文件
前言年初花了2个月做这个,期间把代码给群里view但是大多报错太多,那时我还是不知道什么原因。4月左右总结了最后一个项目后,就想这下不会再有错了吧!(都是VS2017害的)最近无聊,用VSCode下载了mingw运行了下代码,好多错…VSCode运行CPP项目安装Code RunnerC/C++GBKtoUTF8几个插件,下载安装mingw,将D:\Program Files\mingw64\bin加入环境变量,然后打开一个新的文件夹,写个简单的CPP或者C的文件,运行下F5或者右上角的三角原创 2020-10-02 13:15:50 · 592 阅读 · 1 评论 -
【Suatin】不学编译原理就制作语言15.5——C++如何在struct中使用union???
前言lua底层中对数据结构的实现就是靠struct和union的嵌套实现的,我两个月前开始自制语言时也想这样,但是苦于union使用一直出错,不得已用struct代替了union,这使得解释器浪费了大量的无用内存……struct中嵌套union解决方法如果这么嵌套会出现:union xxx 的默认构造函数或者析构函数被删除了,无法使用!!!解决方法很简单,被删除的函数,再定义回来就行!!!...原创 2020-03-28 21:43:11 · 456 阅读 · 0 评论 -
【Suatin】不学编译原理就制作语言16——变量栈
前言结束了,不做了原创 2020-03-26 22:07:28 · 275 阅读 · 0 评论 -
lang:自制编程语言15——break&continue
前言上一篇增加了一个assert关键字,这一篇增加两个关键字,break,continue。有了这两个关键字后,循环就方便多了。原创 2020-03-19 17:17:52 · 293 阅读 · 0 评论 -
【Suatin】不学编译原理就制作语言14——增加调试机制
前言引入一个关键字,解释到该关键字的时候就暂停终端,只有输入了回车才能继续,大概是这样的机制。原创 2020-03-19 12:31:42 · 236 阅读 · 0 评论