An open API service indexing awesome lists of open source software.

https://github.com/keyu-tian/cp-miniplc0

miniplc0 implementation based on pure python
https://github.com/keyu-tian/cp-miniplc0

Last synced: 3 months ago
JSON representation

miniplc0 implementation based on pure python

Awesome Lists containing this project

README

        

# Miniplc0 Python 版

## 运行环境
- 纯 Python 实现,无需安装扩展库。
- 需要 Python 3.6 及以上。

## 代码解释

#### 词法分析部分
- 位置:`/lexical/*`
- 手动实现了各种字符类型的判断函数,没有直接使用 `str` 类的成员方法。
- `Token` 定义为一个简单的 `namedtuple`,两个字段分别是类型和值。
- 词法分析器的输入(构造函数参数)是原始文本字符串(暂时也是一次性读入)。
- 词法分析器的输出(`parse_tokens` 函数的返回值)是一个 `List[Token]`。

#### 语法分析部分
- 位置:`/syntactic/*`
- 栈式虚拟机的指令,定义为了一个简单的 `VMOperator` 抽象类,其只有一个字段,表示自己可能存在的操作数;本处使用了 `Register` 模式让各个 `VMOperator` 的实现类能够更轻松地被管理,增强了可维护性。
- 语法分析器部分的注释较为全面,基本和 [助教列出的文法](https://github.com/BUAA-SE-Compiling/miniplc0-handbook/blob/master/readme-cpp.md) 做到了一一对应。
- 语法分析器的输入(构造函数参数)是一个 `List[Token]`(也就是词法分析器的输出)。
- 构造语法分析器的时候,为了便于之后判断是否到了文档尾,特意在 Token 列表的末尾增加了一个 `token_type=TokenType.EOF_TOKEN` 的 Token 作为哨兵。
- 语法分析器的输出(`generate_instructions` 函数的返回值)是一个 `List[VMOperator]`。

#### 栈式虚拟机部分
- 位置:`/vm/*`
- 此处提供了一个非常简单的栈式虚拟机实现,其可被调用的基本接口有 `sp`, `push`, `top`, `pop` 和下标访问(已经重载了下标访问读写运算符)。
- 各个栈式虚拟机的指令是 `VMOperator` 的实现子类,他们会组合调用上述的基本接口,达到运算的目的。

## 本地运行测试

#### 运行词法分析(可独立运行)
```shell script
sh ./analyze_lexically.sh
```

#### 运行语法分析(可独立运行)
```shell script
sh ./analyze_syntactically.sh
```

#### 运行虚拟机(需先运行语法分析,得到指令输出到文件中再作为虚拟机的输入)
```shell script
sh ./run_vm.sh
```