xec_if break case FOR: exec_for break case NEXT: next break case INPUT: input break case GOSUB: gosub break case RETURN: greturn break case END: exit0 while tok FINISHEDmain 函数其实没啥好说的,主要是这个函数是个花架子,真正实在的逻辑处理不在这里。
不过特别需要强调的是 prog 这个字符指针,这是程序的命根子,它打到哪儿我们就得运行到哪儿,get_token 就得取哪儿的标识符。
当然这种重要的东西肯定是掌握在我们自己手里。
另外是 setjmp 函数,这个可以理解为 windows 系统中的系统还原,一旦出错我们程序可以跳到这个还原点。
在 while 循环里,我们一行一行处理源代码,注意是一行一行的进行,比如 print abc 我们会在 print 函数里面循环打印 abc 。
而不会多次调用 print,这种设计很巧妙。
来先看看变量赋值函数 assignment:/ 给变量赋值 比如 a=3 注意这里为了简化起见,我们的变量就设置为 26 个字母 /assignment int varvalue / getthe variable name / get_token if isalphatoken //因为变量我们用字母代替 所以必定是字母类型 serror4 return var touppertoken-A //转化为大写字母 然后减去A 这样让变量在 hash 表中有了座次 比如 A 减去 A 为 0 这样 A 字符变量在变量 hash 表中第一个位置 / get the equals sign 这里我们取 a3 中间的等号/ get_token if token //既然赋值么 肯定有等号了 serror3 return / a3 等号取走了 我们来取数值 / get_expampvalue / 把我们取到的变量 比如 a 值为 3 存放在 hash 表中 / variablesvar value这里的变量我们用 26 个字母表示,比较简单,减少了我们代码逻辑判断,当然缺点就是变量不能见名知义,还有有时不够用,要知道我们这个 basic 没有所谓的全局变量和局部变量,都作为全局处理的。
这里面又嵌套了一个函数——serror,看名字就知道是错误处理的:/ display an error message /void serrorint error char e quotsyntax errorquot quotunbalanced parenthesesquot quotno expression presentquot quotequal sign expectedquot quotnot a variablequot quotlabel table fullquot quotduplicate labelquot quotundefined labelquot quotTHEN expectedquot quotTO expectedquot quottoo many nested FOR loopsquot quotNEXT without FORquot quottoo many nested GOSUBquot quotRETURN without GOSUBquot printf quotsnquoteerror longjmpe_buf1 / return to save point /这个函数就是个打印,里面有个 longjmp,就是上面所说的跳到quot系统恢复点quot,与 setjmp 隔江相望。
具体可以查查ltunix 高级环境编程gt。
是所谓先来后到,我们还是按照主函数出现的顺序,依次分析逻辑函数。
1、printprint 函数主要的关注两点,第一点是打印格式,第二点是打印方式。
比如我举两例:print aprint quothello world quot 要分清楚打印变量还是打印字符串 这是打印方式的问题print abprint ab 要分清楚打印格式,注意一个是分号一个是逗号 两者有区别print 代码:/ execute a simple version of the BASIC PRINT statement 执行打印 这里我们还是举例说明/void print int answer int len0spaces char last_delim do get_token / get next list item / if tokEOLtokFINISHED break //如果取到的符号是一行结束或者文件结束 自然的打印结束 //BASIC 中 print 一般有两种用法 第二种就是 print quothello worldquot 打印字符串 if token_typeQUOTE printf quotsquottoken lenstrlentoken ge.