主题:【原创】语言编译器等请教 -- 中国农民
文法类似于C,但是没有C那么灵活,不然我的编译器就太复杂了,那不是拿起石头砸自己的脚嘛!但是也没有PASCAL 那么严格,最基本的功能都有了,IF..THEN..ELSE判断语句,WHILE, DO...WHILE, FOR 循环,调用子程序包括了CALL BY REFERENCE和 CALL BY VALUE等等,反正,对于学习编译是足够了。
其实我自己觉得最有意思的是语义分析部分,最后发现最简单的堆栈就蛮好用的。最简单的,如果没有括号这样的比较复杂一点的优先级的话,比如
X=A+B;
根据第一轮的扫描,我们知道有X,=, A,+,B,;这样几个TOKEN, 发现第一个算符,比如=,就先压进算符堆栈,再后面扫描到了加法,先把+号压进堆栈,等到发现B后面没有更高级别的计算了(比如乘除法运算),就弹出这个+算符,然后从另外一个算子堆栈里弹出两个算子A和B,这样就生成了一句类似汇编的中间语言,就像这样
ADD A,B
MOV AX,X
把变量A和B相加,结果在寄存器AX里面,然后把这个值移到变量X里面。
当然,真正的算法远比这个复杂多了,十多年了,细节记得不是太清楚,不过大概的意思就是这样的。
- 相关回复 上下关系8
压缩 2 层
😁这又让俺想起泰让兄给俺留的作业: 逆波兰算法 1 面壁 字92 2007-11-06 11:59:07
😁逆波兰表达式 东湖珞珈 字52 2007-11-06 12:27:09
🙂很酷啊,多讲讲。你的编译器进去的是什么语言? 请尽量 字62 2007-11-06 10:29:42
🙂自己定义的一个语言
🙂说来曾想写Text Adventure游戏的 Levelworm 字60 2007-11-10 21:55:36
🙂俺也整过这玩意 1 好说好说 字104 2007-11-06 16:44:42
😁是啊 东湖珞珈 字58 2007-11-06 18:09:43
🙂那个中间语言在转换成汇编前还需要作语义处理么?还是 请尽量 字199 2007-11-06 14:21:23