Futurebasic/语言/语法
一个 FB 程序由一系列语句和可选的语句标签组成。通常你将每个语句写在一行上;然而,也可以在一行上放置多个语句,反之,一个语句也可能跨越多行。
你可以在一行上编写多个语句,方法是用冒号分隔每对语句,如以下示例所示
A = 7 * B : Print score(A) : Fn doSum(x)
如果一行以续行符结尾,该行上的(最后一个)语句将在下一行继续。续行符看起来像这样:¬,可以通过输入 Option-L 来输入。示例
myArray(numberDogs, numberCats, numberPorcupines) ¬ = Fn createMenagerie(Mid$(animalName$(x), ¬ nameOffset, 4), vetNumber)
虽然你可以安全地在引号字符串中插入换行符 [option-L],但在其他地方,最好只在语句之间插入换行符,并且绝对不要将其与块语句混合使用。对于仍然使用行号的人来说,程序中的任何一行(除了紧接在续行符之后的行)都可以以行号开头。
某些特殊语句标志着“块结构”的开始或结束。“块结构”的打开或关闭语句不应与同一行上的任何其他语句一起出现。这些语句包括以下内容
#If... #Else... #EndIf Begin Enum... End Enum Begin Globals... End Globals Begin Record... End Record BeginAssem... EndAssem Compile Long If... Compile Xelse... Compile End If Dim Record... Dim End Record Do... Until EnterProc... ExitProc EnterProc%... ExitProc% For... Next Local Fn... End Fn Long Fn... End Fn Long If... Xelse...End If Select Case... End Select Case While... Wend
程序中的任何一行(除了紧接在续行符之后的行)都可以以行号开头。行号必须是 1 到 65534 之间的整数,并且没有两行可以具有相同的数字。至少应有一个空格字符将行号与该行中的第一个语句分开。示例
140 Print "Hello": Beep
行号对于标识程序中的特定位置很有用,例如作为 Goto
或 Gosub
等语句的目标。但是,行号被认为是一种过时的语法功能,因此一般不建议使用。
语句标签是标识程序中特定位置的另一种方法。语句标签必须单独出现在一行上,并且同一个标签不能在程序中出现多次。根据您的偏好设置,您可以通过以下方式表达语句标签
双引号内的字符字符串。示例
"My First Label"
一个非空格字符字符串,后面跟着一个冒号。这种标签只有在“允许 QuickBasic 标签”首选项设置时才可用(请参阅编辑器手册)。示例
Label17:
与行号类似,如果程序包含 Goto
或 Gosub
等语句;或者如果您的程序使用 Line
或 Proc
函数,则语句标签很有用。
请注意,当 QuickBASIC 标签的首选项打开时,FutureBASIC 语句在编译器看来可能看起来像 QuickBASIC 标签。示例
Print:Stop:Rem this won't work with QB labels On
由于 QuickBASIC 标签要求文本和冒号之间没有空格,因此您可以按如下方式避免可能的错误
Print : Stop : Rem note the space before the colon
FB 中的每个语句都是可执行语句或不可执行语句。
可执行语句表示在程序运行时要执行的指令。当您运行程序时,给定的可执行语句可能会执行一次,或多次,或根本不执行,具体取决于程序条件。可执行语句执行的顺序不一定与它们在程序中出现的顺序相同。可执行语句的示例包括:Print
;Let
;Read
;Open
。
不可执行语句表示告诉 FB 编译器如何构建程序的指令。它们帮助编译器确定如何分配内存以及如何解释和编译程序中的其他语句。不可执行语句在程序中出现的顺序很重要:当编译器构建程序时,它会从上到下扫描所有语句,不可执行语句只能影响其下方出现的行的解释。您无法通过将不可执行语句放在“条件执行”块(如 Long If...End If
或 For...Next
)中来更改不可执行语句的效果。但是,您可以通过将不可执行语句放在 Compile Long If
块中来有条件地将不可执行语句包含在程序中或从程序中排除。不可执行语句的示例包括:Dim
;Data
;Local Fn
;Def Len
。
程序的某些部分可能位于函数块和过程块内。函数和过程块是语句块,这些语句块被以下语句对包围
Local Fn...End Fn Long Fn...End Fn EnterProc...ExitProc
位于所有函数和过程块之外的语句被称为属于程序的“主”部分。“主”语句可以位于函数和过程块之前,或者位于它们之后,或者两者都有。
当您的程序运行时,“主”中出现的第一个可执行语句是实际执行的第一个语句。之后,执行顺序取决于程序的具体情况:通常,语句按它们在“主”中出现的顺序执行,但 Long If
;Goto
;While
;Fn <userFunction>
等语句可能会改变执行流程。函数块和过程块在使用 Fn <userFunction>
等语句显式“调用”之前不会执行。程序在遇到 End
或 Stop
语句时停止,或者在遇到“主”中的最后一个语句时停止。请注意,如果“主”中没有可执行语句,那么您的程序将不会执行任何操作。
标识符是您为程序中的某些内容命名的名称。在 FB 中,标识符用于命名以下类型的对象
- 变量;
- 数组(见下文);
- 用户定义的函数(见
Local Fn
、Long Fn
等语句); - 用户定义的数据类型(见
#Define
和Begin Record
语句); - 记录字段(见
Begin Record
和Dim
语句); - 符号常量(见“常量声明”语句)。
在 FB 中,标识符的长度可以达到 245 个字符。它必须以字母开头;其后续字符可以是字母、数字和下划线字符(_)的任意组合(符号常量名称不应包含嵌入的下划线)。表示变量、数组和函数名的标识符也可以后接“类型标识符后缀”,它是一个 1 或 2 个字符的符号,用于指定项目的 数据类型(见附录 C 以获取类型标识符后缀的列表)。标识符“不区分大小写”,因此标识符 highscore
和 HighScore
都被识别为相同的标识符。
您可以使用相同的标识符来命名两个不同的东西,只要上下文清楚地表明指的是哪个东西即可。例如,您的程序可能有一个名为BookList$
的变量,以及一个名为BookList$
的本地函数; FB 可以区分这两个,因为对本地函数的引用在您的程序中始终以 Fn
关键字开头。
变量可以被认为是“用于存储数据的命名容器”。在 FB 中有多种方式来表示变量;有关更多信息,请参见附录 B。每个变量都与一个“数据类型”相关联,该类型决定了变量所占用的内存量以及如何解释变量的值。FB 中预定义了许多数据类型;您还可以创建称为记录的用户定义数据类型。有关更多信息,请参见 附录 B:变量。
数组是变量的集合,它们共享相同的名称和相同的数据类型。集合中的每个变量称为数组元素;您的程序通过下标来区分一个元素与另一个元素,下标是在数组名称后面用括号括起来的数字。例如,如果 theAngle
是数组的名称,那么 theAngle(3)
表示数组中的一个元素,而 theAngle(4)
表示数组中的另一个元素。
上面的例子说明了一个一维数组。在二维数组中,每个元素由一个唯一的下标有序对表示。如果 Salary&
是一个二维数组的名称,那么 Salary&(4,7)
表示数组中的一个元素,而 Salary&(7,4)
表示数组中的另一个元素。一个数组可以有多个维度;实际上,它可以高达 255 维。您使用 Dim
语句来声明给定数组有多少个维度,并指定可以分配给每个下标的最大值。
可以分配给下标的最小值始终为 0。
在本手册剩余部分中出现的语法描述中,将应用以下约定
- 以
斜体
表示的项目是占位符,应根据描述中指示进行替换; - 以
粗体
表示的项目是您应该完全按照显示的输入的文字; - 以
普通非斜体文本
表示的项目是您通常应该完全按照显示的输入的文字;但是,以下字符不应该输入,但具有下面解释的特殊含义
[ ] { } | …
- 用方括号 [ ] 括起来的项目是可选的;
- 用花括号 { } 括起来并用竖线 | 分隔的项目表示一个列表,您应该从中选择一项;
- 用方括号 [ ] 括起来并用竖线 | 分隔的项目表示一个列表,您应该从中选择一项或零项;
- 省略号 (…) 表示前面的项目可以重复无限次。
示例:考虑以下语法描述模板
bob [, {bill | ron [, rick]}]
此模板匹配以下每个模板
bob bob, bill bob, ron bob, ron, rick