- 纯 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