sunzx 发表于 2009-2-11 01:41:48

贴一个花了一天折腾出来的东西, 简易BASIC解释器【恢复】

使用USB CDC类模拟串口.

在网站小板+UC3B0256上可以运行.

一天工夫写出来的, 几乎没有任何异常和错误处理, 请自行验证程序语法正确性并承担使用风险...



解释器的文档在代码注释里面, 就不单独贴了. 跟一般的BASIC解释器最主要的不同是没有数组功能, 加了一个数据栈和PUSH, POP两条指令.

在AVR32 Studio中请使用Release方式build.



在最大行数1000, 表达式存储区大小5kB, 支持100层GOSUB和256字节深数据栈, 最大输入行宽80的情况下, 占用存储器情况如下:

   text    data     bss     dec     hex filename

  65502    2152   17092   84746   14b0a BASIC_Demo.elf



图是一个简单的汉诺塔程序.



点击此处下载 ourdev_617790.rar(文件大小:266K) (原文件名:BASIC_Demo.rar) 

http://cache.amobbs.com/bbs_upload782111/files_11/ourdev_617791.png

 (原文件名:hanoi1.png) 



http://cache.amobbs.com/bbs_upload782111/files_11/ourdev_617792.png

 (原文件名:hanoi2.png) 



开跟踪的时候运行的情况:

>TRON

>RUN

 3

             

             [2

40]             1

->3

            [28

0]            1->2

            [3

10]             [440

]             [

1050]  3->2

             [

280]            

1->3

            [32

0]             

              [

110]          2->1

            [290

]             [1

040] 2->3

            

              [

130]       1->3

            [46

0]         >

sunzx 发表于 2009-2-11 01:59:48

编辑功能, 尤其是删除行的功能有bug, 等明天慢慢抓.

大家试验的时候尽量在外面一次写好.

Gorgon 发表于 2009-2-11 23:37:51

麻雀虽小,五脏俱全的。

sunzx 发表于 2009-2-11 23:27:23

【12楼】 ifree64 那个是1990年IOCCC比赛的获奖作品DDS-BASIC.我的这个解释器里面的表达式求值器(那个eval.c)就是从那里面来的. 我在注释里提到过.事实上我一开始想把这个DDS-BASIC移植到AVR32, 结果发现这东西把每一行程序都按原始格式在内存中存储, 占空间太大还容易惹麻烦所以才另起炉灶写了一个... 唯一利用到的就是DDS-BASIC的表达式求值器. 这个求值器是个很简单的recursive descent parser, 很容易明白, 可以处理含有25个字母的变量, 整型数(正的和负的), 加减乘除, 以及关系运算.下一步不忙的话就给这个解释器加入错误处理机制.

本贴被 sunzx 编辑过,最后修改时间:2009-02-11,23:43:13.

ifree64 发表于 2009-2-11 23:08:47

我这个人忘性很好,以前学习过一点basic,现在都忘完了。在《C专家编程》一书里有一个用“混乱C代码”编写的basic解释器代码。我学习了一段时间,那段代码写得真是太精巧了,整个解释器只有大约200行代码。楼主要是感兴趣可以找来看看。

sunzx 发表于 2009-2-11 21:55:36

【10楼】 y2kloach1. (这点最重要!)写之前先把做什么, 怎么做想得十分清楚, 清楚到你能把事情跟一个只学过一门高级语言, 没有任何算法修养和编程经验的人说清楚, 并且能让他写出来. 否则不要动手. 计算机不能做你也搞不明白的事情. 不要害怕耽误时间去想, 想不耽误事儿, 而且边想可以边干些不太需要脑子的活.2. 不能让语言成为障碍. 这样写代码的时候关注的是问题而不是代码的语法. 这个没别的办法, 只能熟能生巧. 写个三年五年八年十年的就熟了...当然这说的只是写算法的时候的事儿. 如果涉及到比如单片机程序这种需要跟其他器件商量怎么说话的事情, 还需要仔细阅读器件的资料来搞清楚事情.

y2kloach 发表于 2009-2-11 21:14:04

楼主一天就能写出如此代码,小弟深感佩服!!楼主授之于鱼,不如授之于渔,楼主能否分享一下你的快速开发的方法!小弟膜拜中.......小弟多年受困于写代码速度超慢, 请楼主指教一二.

sufeila 发表于 2009-2-11 20:46:52

顶一下.不错建议"发扬光大".

sunzx 发表于 2009-2-11 19:31:13

【3楼】 Gorgon Meducer 傻孩子参考函数库只有一个简易表达式求值器. 事实上我是看了你的贪吃蛇之后才想起来这玩意儿可以干这个用的...之所以快, 一方面是由于我上学的时候做过生物信息学的东西, 处理生物学家生成的各种稀奇古怪格式的数据攒了点经验, 写类似的东西比较熟练不过主要还是仰仗GCC良好的可移植性. 调这个程序的时候target是PC, 只要注意资源的使用, 并且把I/O包出来做成可移植的, 交叉编译到AVR32上几乎不需要改动. 因为不管target是PC还是AVR32, GCC的前端都是一样的; 而且这个东西几乎与平台无关, 任何拥有基于字节的I/O, 足够的内存以及GCC编译器和标准库的平台, 都可以运行这个东西. 而这三样东西AVR32恰好都有...【4楼】 17133983 这个想法很好, 可惜在这儿不太实用.第一, BASIC的语法结构实在太简单了, 用Lex和YACC干这活儿是杀鸡用牛刀. 伺候这兄弟俩的工夫, 这个解释器也就写出来了.第二, AVR32提供的资源有限, 运行自动生成的parser可能会有麻烦.但是不能否认的是用这兄弟俩干这活儿, 处理语法错误会方便很多. 这也是这个解释器基本上没实现的东西.【5楼】 kingofkings 技术火腿版大谬赞了... 其实就是图个好玩儿...

sunzx 发表于 2009-2-11 19:15:38

贴个更新. 修正了编辑程序时的几个重要的bug, 增加了不换行的PRINT.现在的汉诺塔看起来是这样的:>LIST5 PRINT 'Input N: '10 INPUT N15 T=020 F=130 D=340 B=250 GOSUB 10055 PRINT "60 PRINT 'Total steps: '70 PRINT T80 END100 REM Hanoi Tower110 PUSH N120 PUSH F130 PUSH D140 PUSH B150 IF N>1 THEN GOTO 200155 T=T+1160 PRINT F;170 PRINT '->'180 PRINT D;185 PRINT ' '190 GOTO 450200 N=N-1210 REM Swap D and B220 PUSH D230 PUSH B240 POP D250 POP B260 GOSUB 100270 PUSH N280 N=1290 D=B300 GOSUB 100310 POP N320 REM Restore F, D and B330 POP B340 POP D350 POP F360 PUSH F370 PUSH D380 PUSH B390 REM Swap F and B400 PUSH F410 PUSH B420 POP F430 POP B440 GOSUB 100450 POP B460 POP D470 POP F480 POP N490 RETURNProg_ptr: 54/1000 lines.Exp_ptr: 204/5000 bytes.>TRON>RUN Input N:  3                                       1 -> 3                    1 -> 2                              3 -> 2                        1 -> 3                                           2 -> 1                   2 -> 3                              1 -> 3                   Total steps:  7>TROFF>RUNInput N: 31->3 1->2 3->2 1->3 2->1 2->3 1->3Total steps: 7>点击此处下载 ourdev_619067.rar(文件大小:211K) (原文件名:BASIC_Demo_0.02.rar) 

Gorgon 发表于 2009-2-11 18:37:58

to 【4楼】 17133983     又砸出来一个深度静音潜航的核威胁……^_^高人还是多哈^_^啥时候我也能砸出来一个? 

kingofkings 发表于 2009-2-11 17:53:44

哦也,顶下AVR32 坛的Cool帖水准果然不一般, 娃哈哈哈哈哈哈

本贴被 kingofkings 编辑过,最后修改时间:2009-02-11,17:54:55.

17133983 发表于 2009-2-11 17:31:45

不错,不过不知道楼主是否了解编译原理。如果了解的话可以看以下LEX和YACC,可以通过脚本自动生成解析代码。事半功倍

Gorgon 发表于 2009-2-11 08:16:24

早晨就看到如此神贴!今天运气真好!楼主程序一天写出来,可见冰冻三尺非一日之寒哈。厉害!请问,楼主经常编写这类东西么?或者说有不少类似的参考函数库?

本贴被 Gorgon Meducer 编辑过,最后修改时间:2009-02-11,08:16:47.

buffalo 发表于 2009-2-11 08:14:04

不错,继续努力

hecat 发表于 2009-2-25 14:08:52

Mark!

sunzx 发表于 2009-2-26 21:44:50

感动啊, 就这么被恢复了. 这个帖子我自己都没留...

qzzz 发表于 2009-2-26 22:52:42

祝贺恢复!


问一下,51或者AVR上面可以实现BASIC解释器么?需要些什么知识做准备?谢谢

xukaiming 发表于 2009-10-22 12:46:09

这个应该给条裤子

smallworm 发表于 2009-10-22 16:41:50

学习了

KEKEMUYU 发表于 2010-10-11 00:24:53

.

hecat 发表于 2019-1-3 15:18:48

请问10楼帖子的附件能恢复吗?

tomzbj 发表于 2019-1-3 15:34:57

hecat 发表于 2019-1-3 15:18
请问10楼帖子的附件能恢复吗?

sunzx的密码丢了, github上找吧

https://github.com/sunzx/TarielBASIC

hecat 发表于 2019-1-3 15:59:10

tomzbj 发表于 2019-1-3 15:34
sunzx的密码丢了, github上找吧

https://github.com/sunzx/TarielBASIC

我去,以为不会有回应了。
谢谢,非常感谢。
找过很多解释器,大都只支持代码运行。
您写的解释器的源代码编辑功能非常有用。
再次感谢!!!

tomzbj 发表于 2019-1-3 16:20:07

hecat 发表于 2019-1-3 15:59
我去,以为不会有回应了。
谢谢,非常感谢。
找过很多解释器,大都只支持代码运行。


汗, 我不是sunzx啊~

老莫啥时帮他把密码找回来吧 @armok

hecat 发表于 2019-1-3 16:35:17

tomzbj 发表于 2019-1-3 16:20
汗, 我不是sunzx啊~

老莫啥时帮他把密码找回来吧 @armok

谢谢你提供gtihub的下载地址。{:biggrin:}
页: [1]
查看完整版本: 贴一个花了一天折腾出来的东西, 简易BASIC解释器【恢复】