一、词法分析器Lexer
1.使用之前自己写的正则表达式引擎简化版(没有匿名捕获)完成词法分析
2.遇到错误则记录下错误信息,并跳过此错误继续分析
3.词法分析的结果记录了记号串、对应的类型和行号
4.因为没判断该记号串是否为关键字等,给语法分析带来许多不必要的麻烦
二、语法分析器Parser
1.用上下文无关文法和类似于状态机的方法递归向下构造语法分析树
2.用继承的方法来存储语法树
3.构造语法树和存储语法树是相对独立的两个部分
4.构造语法树的过程中遇到错误抛出异常前应释放内存,容易出现内存泄漏,使用智能指针LytPtr解决此问题
5.错误信息包括出错原因、行号
三、语义检查
1.表达式才有类型,语句、函数没有类型
2.表达式是GetType,语句、函数是CheckType
3.类型检查函数声明为虚函数是比较方便的,同样使用了递归向下的方法
4.类型检查包括以下内容:
(1)表达式
a.常量表达式:整型、浮点型、布尔型
b.变量表达式:该变量是否被声明过
c.一元表达式、二元表达式:操作符与操作数类型是否匹配
d.函数调用表达式:函数是否被定义,参数个数、参数类型是否匹配函数原型
(2)语句
a.赋值语句:左操作数必须是左值(变量表达式),左右操作数类型是否一致
b.if语句、while语句、dowhile语句:条件表达式必须是布尔型
c.跳转语句break、continue只能出现在循环中
d.return语句在function函数中必须带表达式,procedure函数则相反
(3)函数
a.有且只有一个main函数
b.函数不可重载
c.function函数必须有返回类型声明且return语句必须有表达式,procedure函数相反
d.参数和变量不可重定义
四、虚拟机
1.堆栈里只存储基本数据(原本我存储的是字符串,修改后速度提高许多)
2.设计指令集并生成中间代码,使用了递归向下的方法(虚函数)
3.遇到一些运行错误抛出异常,如除以0
五、其他问题
1.遇到了“名字用完了”的状况,起名字真的非常重要,头一回意识到namespace
2.错误信息应该用#define或者常量字符串来统一管理
3.对于一些常量,如字符串转成浮点型的应该用一个文件以常量形式存起来统一管理
posted on 2009-04-09 22:27
Lyt 阅读(793)
评论(0) 编辑 收藏 引用 所属分类:
Pascal简化版