2023-04-09 05:35:35 +00:00
|
|
|
|
.. SPDX-License-Identifier: GFDL-1.3-or-later
|
|
|
|
|
|
2023-04-01 15:07:15 +00:00
|
|
|
|
表达式和语句
|
|
|
|
|
============
|
|
|
|
|
|
|
|
|
|
要讨论语句,自然避免不了表达式了。我们先来看看表达式。
|
|
|
|
|
|
|
|
|
|
表达式
|
|
|
|
|
------
|
|
|
|
|
|
|
|
|
|
表达式用来产生一个值。它可能本身就是一个值,也可能是值与值之间进行加减之类的运算,也可能是执行一个动作获得返回值之类的。
|
|
|
|
|
|
|
|
|
|
数值型表达式
|
|
|
|
|
~~~~~~~~~~~~
|
|
|
|
|
|
|
|
|
|
数值型表达式,说白了就是一个值。它具体又分为这几种类型:
|
|
|
|
|
|
|
|
|
|
布尔型
|
|
|
|
|
^^^^^^
|
|
|
|
|
|
|
|
|
|
布尔型就是\ *真、假*\ 这两个字。实践表明这两个字几乎不会被用到。
|
|
|
|
|
|
|
|
|
|
数量型
|
|
|
|
|
^^^^^^
|
|
|
|
|
|
|
|
|
|
一个整数,比如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:
|
|
|
|
|
|
|
|
|
|
函数调用
|
|
|
|
|
~~~~~~~~
|
|
|
|
|
|
|
|
|
|
详见函数那一章。
|
|
|
|
|
|
|
|
|
|
数组操作
|
|
|
|
|
~~~~~~~~
|
|
|
|
|
|
|
|
|
|
详见后文。
|
|
|
|
|
|
|
|
|
|
动作语句
|
|
|
|
|
~~~~~~~~
|
|
|
|
|
|
|
|
|
|
终于到所有语句中的重头戏——动作语句了。动作语句用来执行一个实际的动作,比如摸牌、打伤害之类的,有些动作语句还能产生值。
|
|
|
|
|
|
|
|
|
|
但是由于动作语句的类型太多了,在这里罗列不太现实。请各位去查看参考手册吧。
|