在上一篇文章中用Python开发一个自制的编程语言(虚拟机解释型)[0]_python自制编程语言_嘉定世外的JinJiayang的博客-CSDN博客
简述了我们的编程语言的功能和我们的最终目标,现在就让我们正式启航吧!
大致框架
作为一个虚拟机式的编程语言,我们的解释器应该具有parser模块和runner模块,同时也要具有丰富的库系统,因此我们要在任意目录下新建文件夹:ScrJ(我的编程语言的名字是ScrJ,你可以用你的编程语言的名字),它的结构是:
ScrJ
SJLib
SJParser
SJRunner
SJServer
main.py
__init__.py
SJLib是ScrJ库文件,SJParser是分析器,SJRunner是虚拟机,SJServer安放了程序运行相关文件,main.py是主入口,__init__.py应该不用我赘述了。
词法分析器
词法分析器是什么?它负责把一些代码进行断句,变成token流,比如C++程序:
#include<bits/stdc++.h>
using namespace std;
int main() {
cout << "hello,world" << endl;
return 0;
}
把它丢进词法分析器里,它会返回:
#
include
<
bits/stdc++.h
>
using
namespace
std
;
int
main
(
)
{
cout
<<
"
hello,world
"
<<
endl
;
return
0
;
}
的符号流。
我们的编程语言有如下符号(symbol):
'(', ')', '"', '{', '}', '[', ']', ',', ';'
有如下标识符(operator):
'+', '*', '-', '/', '%', "//", '=', '>', '<', '>=', '==', '<=', '!=', '<-', '->', '.', ',', '&', '|' '++', '--', '&&', '||', '!' "::", ":"
词法分析器的作用:将代码转为符号流。
代码 -> 符号流 -> AST -> 结果
wordparser sentenceparser runner
词法分析(英语:lexical analysis)是计算机科学中将字符序列转换为单词(Token)序列的过程。进行词法分析的程序或者函数叫作词法分析器(Lexical analyzer,简称Lexer),也叫扫描器(Scanner)。词法分析器一般以函数的形式存在,供语法分析器调用。 完成词法分析任务的程序称为词法分析程序或词法分析器或扫描器。
--百度百科
具体实现
step1 新建文件
这一步特简单,在 SJParser/ 文件夹下新建文件__init__.py和wordparser.py。
step2 新建类
我们的编程语言是大括号编程语言,同时以行解析,不需要分号。
下面让我们在wordparser.py里创建一个词法分析类:WordParser
class WordParser:
def __init__(self, s):
self._string = s
self.operators = [
'+', '*', '-', '/', '%', "//",
'=',
'>', '<', '>=', '==', '<=', '!=',
'<-', '->',
'.', ',',
'&', '|',
'++', '--',
'&&', '||', '!',
"::", ":"
]
self.symbols = ['(', ')', '"', '{', '}', '[', ']', ',', ';']
这个类拥有四个方法用来判定字符(char,不是token)的类型。
is_letter = staticmethod(lambda char: ('a' <= char <= 'z') or ('A' <= char <= 'Z') or (char == "_"))
is_digit = staticmethod(lambda char: '9' >= char >= '0')
is_space = staticmethod(lambda char: True if char == ' ' or char == '\t' else False)
is_var = lambda self, char: __import__("functools").reduce(lambda x, y: x and y, [self.is_digit(i) or self.is_letter(i) for i in char], True)
# 我是压行大师
好吧,如果你不习惯看这种风格,我们正常点:
@staticmethod
def is_letter(char):
return ('a' <= char <= 'z') or ('A' <= char <= 'Z') or (char == "_")
@staticmethod
def is_digit(char):
return '9' >= char >= '0'
@staticmethod
def is_space(char):
if char == ' ':
return True
elif char == '\t':
return True
else:
return False
def is_var(self, char):
for i in char:
if not (self.is_digit(i) or self.is_letter(i)):
return False
else:
return True
step3 新建解析方法
然后,即将进入到最重要的part,我们要新建一个解析方法:parse
def parse(self):
pass
而在这个方法里,我们将执行分析操作,并返回符号流。而这部分如何完成,为了避免这篇文章过于臃肿,知识量太大,写作人太累,我们在下一篇再详细讲解。
END
好了,今天到此为止,下一篇我们将详细讲述词法分析器(wordparser),保证让你拥有一个属于自己的parser。
如果你也想尝试这个项目的话,不妨点个赞,关注本专栏,thanks~