用Python开发一个自制的编程语言(虚拟机解释型)[1] 词法分析器(1)

在上一篇文章中用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~

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,我可以帮你介绍一下如何使用 Python 构建一个简单的词法分析器。 在 Python 中,你可以使用正则表达式来匹配文本中的各种模式,从而实现词法分析的功能。下面是一个简单的示例代码: ```python import re # 定义正则表达式规则 TOKENS = [ ('NUMBER', r'\d+'), ('PLUS', r'\+'), ('MINUS', r'-'), ('MULTIPLY', r'\*'), ('DIVIDE', r'/'), ] # 定义词法分析器函数 def lex(input_string): tokens = [] while len(input_string) > 0: match = None for token in TOKENS: name, pattern = token regex = re.compile(pattern) match = regex.match(input_string) if match: text = match.group(0) tokens.append((name, text)) input_string = input_string[len(text):] break if not match: raise ValueError('Illegal character: %s' % input_string[0]) return tokens # 测试词法分析器 input_string = '3 + 4 * 2 - 1 / 5' tokens = lex(input_string) print(tokens) ``` 在上述代码中,我们定义了一个 TOKENS 列表,其中包含了我们想要识别的各种模式。例如,我们定义了一个名为 NUMBER 的模式,它可以匹配一个或多个数字字符。我们还定义了一些其他的模式,如 PLUS、MINUS、MULTIPLY 和 DIVIDE,它们可以匹配加减乘除等运算符。 然后,我们定义了一个名为 lex 的词法分析器函数。它使用一个 while 循环来遍历输入字符串,并在 TOKENS 列表中查找匹配的模式。如果找到了匹配的模式,就将匹配到的文本和模式名称添加到 tokens 列表中,并从输入字符串中删除匹配到的文本。如果找不到匹配的模式,则抛出一个 ValueError 异常。 最后,我们使用 input_string = '3 + 4 * 2 - 1 / 5' 这个字符串来测试我们的词法分析器,并打印输出 tokens 列表,可以得到如下结果: ``` [('NUMBER', '3'), ('PLUS', '+'), ('NUMBER', '4'), ('MULTIPLY', '*'), ('NUMBER', '2'), ('MINUS', '-'), ('NUMBER', '1'), ('DIVIDE', '/'), ('NUMBER', '5')] ``` 这个结果表明,我们的词法分析器成功地将输入字符串分解成了一个个的 token,每个 token 由一个模式名称和一个文本组成。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嘉定世外的JinJiayang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值