.. SPDX-License-Identifier: GFDL-1.3-or-later 表达式和语句 ============ 要讨论语句,自然避免不了表达式了。我们先来看看表达式。 表达式 ------ 表达式用来产生一个值。它可能本身就是一个值,也可能是值与值之间进行加减之类的运算,也可能是执行一个动作获得返回值之类的。 数值型表达式 ~~~~~~~~~~~~ 数值型表达式,说白了就是一个值。它具体又分为这几种类型: 布尔型 ^^^^^^ 布尔型就是\ *真、假*\ 这两个字。实践表明这两个字几乎不会被用到。 数量型 ^^^^^^ 一个整数,比如1376之类的。很遗憾只能是整数,但三国杀里面也基本用不着小数来着。 字符串型 ^^^^^^^^ 一个字符串。 变量 ^^^^ 一个变量。关于变量,将在下一节进行讨论。 数组 ^^^^ 跟C语言的数组的格式差不多,fkparse中数组的格式为 :: '[' [<表达式> {,<表达式>}] ']' 一对\ **半角**\ 方括号,中间是零个或者多个表达式。如果是多个的话,中间要有逗号隔开。 这里说明一下,fkparse的数组里面,所有成员的类型必须相同,否则就报错。 字典 ^^^^ 如同Python里面的字典那样,fkparse也支持字典类型,而且字典的取值相当自由。其格式为: :: '{' {<字符串> ':' <表达式> ','} '}' 运算型表达式 ~~~~~~~~~~~~ 表达式之间支持各种运算。 四则运算 ^^^^^^^^ 加减乘除四种运算,对应的符号分别是\ *+、-、\*、/*\ 。比如2+3,5*3等等。 这个运算要求两个参与运算的表达式都必须是数字类型。运算结果也为数字类型。 比较运算 ^^^^^^^^ 可以对两个数字类型的表达式作比较运算,有以下几种运算符。 - *大于*\ :判断前一个是否大于后一个 - *小于*\ :判断前一个是否小于后一个 - *不是*\ :判断两个表达式是否不相等。这个运算符对两侧的表达式没有类型要求 - *是*\ :判断两个表达式是否相等。这个运算符对两侧的表达式没有类型要求 - *不小于*\ :判断前一个是否不小于后一个 - *不大于*\ :判断前一个是否不大于后一个 运算的结果为布尔类型。运算符直接就是汉字,使用例:2大于3。 这些运算符也可以直接按照C与Lua风格书写:\ ``>, <, !=(或者~=), ==, >=, <=`` 逻辑运算 ^^^^^^^^ 两个布尔类型的表达式可以进行逻辑运算。运算符如下: - *且*\ :若两个都是真,则结果为真,否则结果为假 - *或*\ :只要其中有一个是真,则结果为真;若两者都为假,则结果为假 运算的结果为布尔类型。 运算符就是对应的汉字本身,或者也可以按照C风格和Lua风格:&&(and), \||(or) 函数调用 ~~~~~~~~ 详见函数调用那一章。 动作语句表达式 ~~~~~~~~~~~~~~ 光有上面几种还无法取得所有想要的值,有时候还需要借助动作语句的力量。 动作语句表达式的格式为: :: '(' <动作语句> ')' | 也就是用一对圆括号括起来的动作语句。有关动作语句的详情,稍后会进行描述。 | 接下来介绍变量。 .. _变量-1: 变量 ---- 变量有三种形式: #. ``<标识符>``\ 。一般是先通过赋值语句定义,然后再进行使用。 #. ``<标识符> 的 <字符串>``\ 。用来获得<标识符>对应的那个变量的某一个属性,比如获得卡牌的花色点数之类的。有关于属性列表的信息,可以在参考手册部分找到,这里不罗列。 #. ``'(' <表达式> ')' 的 <字符串>``\ 。有时候需要获得属性的是一个表达式,此时需要把表达式用括号括起来。 所有的变量都需要定义后使用,但预定义好了的除外。预定义变量又分为两种: #. 全局有效的预定义变量,不能重新赋值 #. 根据触发时机而确定的跟相关时机有关的变量,可以重新赋值。(但只有某些时机时候重新赋值才有效)比如\ ``'伤害来源'``\ 。 语句 ---- 表达式用来产生值,而语句则是具体执行的操作。 赋值语句 ~~~~~~~~ 赋值语句的格式为: :: 令 <变量> 为 <表达式> 或者 :: <变量> 为 <表达式> 这个语句通常用来定义变量,也可以改变变量的值。比如\ ``令'Y'为3``\ 就是一个合法的赋值语句。 注意,你不能对系统内置的变量进行重新赋值,否则会报错。如果赋值的变量是形如“xx的xx”这种格式的话,fkparse可能检测不出错误,但这种行为生成的代码可能会无法正常执行。 判断语句 ~~~~~~~~ if语句在几乎任何语言里面都有,fkparse也不例外,判断语句的格式为: :: 若 <表达式> 则 <语句块> { 否则若 <表达式> 则 <语句块> } [否则 <语句块>] 以上 循环语句 ~~~~~~~~ 循环语句的格式如下: :: 重复此流程: <语句块> 直到 <表达式> 这种循环语句是先把语句块执行一遍,再判断表达式,若表达式条件成立就退出循环。fkp还支持while循环: :: 当 <表达式> 重复此流程: <语句块> 以上 这种循环语句会先对表达式进行判断,如果成立的话就执行语句块,然后再判断表达式的值,如此循环,直到表达式不成立为止。 break语句 ~~~~~~~~~ break语句用来中止一个循环,其格式为: :: 中止此流程 请确保自己只在循环语句的内部使用这个,fkparse不会去检查的。如果你在别的地方使用的话,生成的lua会导致游戏无法启动哦。 返回语句 ~~~~~~~~ 返回语句用来让函数带上一个返回值,格式为: :: 返回 <表达式> 这个语句只在定义函数的时候用得到,关于函数定义在后续章节中有讲到。 .. _函数调用-1: 函数调用 ~~~~~~~~ 详见函数那一章。 数组操作 ~~~~~~~~ 详见后文。 动作语句 ~~~~~~~~ 终于到所有语句中的重头戏——动作语句了。动作语句用来执行一个实际的动作,比如摸牌、打伤害之类的,有些动作语句还能产生值。 但是由于动作语句的类型太多了,在这里罗列不太现实。请各位去查看参考手册吧。