================ My BASIC 解释器 ================ by Shandong Han CAT Lab (http://catlab.idogicat.com/) “My BASIC Interpreter”是一个命令行的BASIC语言解释器,它也可以作为表达式求值程序使用。该程序会把结果输出到stdout(标准输出设备),并返回0。如果有错误发生,则向stderr(标准错误设备)输出错误信息,并返回1。 使用方法: mybasic -e <表达式> 或者 mybasic -f 表达式评价 ========== 表达式以BASIC语言的语法书写。该程序支持算术、字符串、关系和逻辑运算。 该程序的具体规格: 数据类型 -------- * boolean * integer * double * string 运算符 ------- * 数学运算符: ^, +(一元运算符), -(一元运算符), *, /, \, MOD, +, - * 字符串运算符: + * 関係运算符: =, <>, <, <=, >, >= * 論理运算符: NOT, AND, OR * 其他: (, ) (圆括号,为了改变运算符的优先级) 数学函数 -------- abs, sign, int, sqrt, exp, log, log10, rad(角度变弧度), deg(弧度变角度), sin, cos, tan, asin, acos, atan, sinh, cosh, tanh, asinh, acosh, atanh, sec, csc, pi(返回圆周率), random(返回[0, 1]区间内的随机数) 字符串函数 ---------- str(num)(数字变字符串), space(n), tab(n), ltrim(str), rtrim(str), trim(str), len(str), ucase(str), lcase(str), val(str)(字符串变数字), isNumeric(str), left(str, n), right(str, n), mid(str, from, n), instr(str1, str2)(如果str1中含有str2,则返回从0开始的索引;如果没有,则返回-1。) 与BASIC语言不同的地方 --------------------- * 一些函数的函数名不同。比如,不是“sqr”,而是“sqrt”。 * 字符串的索引从0开始,而不是从1开始。 * 不支持BASIC语言的类型字符(比如,“2#”表示double型的2),因为这些实在令人讨厌。。。 BASIC 解释器 ============= 本BASIC解释器支持一个实用简练的 BASIC 语法。 “实用简练的 BASIC 语法”的规格(除了上述的表达式规格以外): 支持的特性 ---------- * 注释:REM, ' * 变量声明:DIM ... AS ... * 条件语句(块IF):IF, THEN, ELSEIF, ELSE, END IF * FOR循环:FOR, TO, STEP, NEXT, CONTINUE FOR, EXIT FOR * DO循环:DO, WHILE, UNTIL, LOOP, CONTINUE DO, EXIT DO * 函数和过程:FUNCTION, END FUNCTION, SUB, END SUB, RETURN, BYVAL, BYREF * 输出:PRINT * 其他:END 不支持的特性 ------------ * LET(最没用的命令。直接无视之。) * 行号(太古老陈旧) * GOTO(万恶之源) * GUSUB...RETURN(太古老陈旧) * DEF FN(太古老陈旧) * Single-line IF * READ...DATA(太古老陈旧) * SELECT CASE(不喜欢该语法。但又不想加入如C++的switch/case等太不一样的东西。可以用IF代替。) * ON [ERROR] ...(太古老陈旧) * WHILE ... WEND(太古老陈旧,应以更强大的 DO ... LOOP 代替) * EXIT SUB, EXIT FUNCTION(应以 RETURN 代替) * CALL(但函数可以像过程那样被直接调用) * variant 数据类型(降低代码质量) * 用户定义类型(类) * PRINT USING(如果必要,可考虑将来加进去) * 文件 I/O(OPEN 等。在以后的版本中会加入新的文件I/O函数) 与一般的 BASIC 的不同之处 ------------------------- * 变量必须声明(用DIM)之后才能使用(相当于在 VB 中总是声明“OPTIONAL EXPLICIT”。为了提高代码质量。) * “DIM a, b, c AS DOUBLE”可以,但不支持“DIM a AS INTEGER, b AS DOUBLE”(为了提高代码质量,使程序易读) * Boolean型和Integer型不能相互转换(为了提高代码质量) * 函数或过程:必须声明 BYVAL 或 BYREF(没有缺省。为了提高代码质量。) * PRINT 语句中: - “,”意思是插入制表符,而不是从某一列开始打印(原来的规格太古老陈旧,已不适用于今天的使用环境) - “;”意思是紧接着上次的地方打印。这跟原规格相同,但不会在数字前自动插入一个空格(必要时,程序员应该负责做这项工作) 尚未支持的特性(会在将来的版本中支持) ------------------------------------- * 数据类型 - 数组(多维) o 数组的下标总是从0开始 o 在“DIM A(N) AS INTEGER”语句中,N 是指数组的大小,不是最大下标(最大下标为 N - 1) - date - time - datetime * 内置函数 - 一些统计类函数 - 一些数值算法 - 文件 I/O - 其他的互操作性(?) * 命令 - INPUT (?) License ======== 本软件为非开源的免费软件,可免费使用和传播,但禁止销售给他人。如果发现错误(Bug),欢迎跟我联系(http://www.idogicat.com/misc/contactus_zh.html)。 如果您认为本软件很有用,且希望感谢软件作者,那么请您去帮助身边那些需要您帮助的人,或者向以下的慈善团体捐款: * WWF(World Wide Fund For Nature,世界野生生物基金) * 红十字会 * 其他类似的保护人、动物、环境的慈善团体