Skip to content

keyu-tian/CP-miniplc0

Repository files navigation

Miniplc0 Python 版

运行环境

  • 纯 Python 实现,无需安装扩展库。
  • 需要 Python 3.6 及以上。

代码解释

词法分析部分

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

语法分析部分

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

栈式虚拟机部分

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

本地运行测试

运行词法分析(可独立运行)

sh ./analyze_lexically.sh

运行语法分析(可独立运行)

sh ./analyze_syntactically.sh

运行虚拟机(需先运行语法分析,得到指令输出到文件中再作为虚拟机的输入)

sh ./run_vm.sh

About

miniplc0 implementation based on pure python

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages