翻译指令的 <matchPattern> 部分是输入文本必须匹配的模式。 匹配模式由以下一个或多个部分组成,预处理器会尝试以特定方式将其与输入文本进行匹配:
•字面值是匹配模式中出现的实际字符。 这些字符必须准确无误地出现在输入文本中,才能激活翻译指令。
•单词是关键字和有效标识符,根据 dBASE 惯例(不区分大小写、前四个字母必须为必填项等)进行比较。 匹配模式必须以 Word 开头。
•#xcommand 和 #xtranslate 可以识别超过四个有效字母的关键字。
•匹配标记是用角括号(<>)分隔的标签和可选符号,它提供了在 <resultPattern> 中使用的替代值(idMarker),并标识了其替代的子句。 标记名是标识符,因此必须遵循 xBase 标识符命名规则。 简而言之,名称必须以字母或下划线字符开头,后面可以是字母数字或下划线字符。
本表介绍了所有模式匹配形式:
模式匹配 |
名称 |
<idMarker> |
正则匹配标记 |
<idMarker,...> |
列表匹配标记 |
<idMarker:word list> |
受限匹配标记 |
<*idMarker*> |
通配符匹配标记 |
<(idMarker)> |
扩展表达式匹配标记 |
<#idMarker> |
单个匹配标记 |
<%idMarker%> |
通配符匹配标记 |
•正则匹配标记:匹配输入文本中的下一个合法表达式。正则匹配标记是最通用的标记之一,因此在命令参数中最常使用。由于其通用性,它通常与正则结果标记、所有字符串化结果标记和块化结果标记一起使用。
•列表匹配标记:匹配逗号分隔的合法表达式列表。如果没有输入文本与匹配标记匹配,则指定的标记名称为空。在制作列表规范时必须小心,因为额外的逗号会导致不可预测和意外的结果。
列表匹配标记定义具有列表作为参数的命令子句。通常这些是字段子句或数据库命令使用的表达式列表。当列表匹配标记匹配时,列表通常会使用普通或智能字符串化结果标记 写入结果文本。通常,列表会被写入为字面数组,通过将结果标记括在大括号({})中。.
•受限匹配标记:将输入文本与逗号分隔的单词列表中的一个进行匹配。如果输入文本至少与其中一个单词不匹配,则匹配失败,标记名称为空。
受限匹配标记通常与logify结果标记一起使用,将逻辑值写入结果文本。如果受限匹配标记有匹配项,相应的logify结果标记将向结果文本写入true (.T.);否则,写入false (.F.)。这在定义由命令关键字组成且没有附带参数的可选子句时特别有用。Std.ch 使用这种形式实现数据库命令的REST子句。
•通配符匹配标记:匹配从当前位置到语句结尾的任何输入文本。通配符匹配标记通常匹配可能不是合法表达式的输入,例如在 Clippers Std.ch 中的 #command NOTE <*x*>,将输入文本收集到语句的末尾,并使用其中一个字符串化结果标记将其写入结果文本。
•单个匹配标记:匹配所有连续的标记,直到遇到一个空白标记。
•通配符匹配标记:匹配一个由 Id、逗号、? 或 * 组成的标记列表。这可以在诸如 SAVE ALL LIKE a*,b* 的命令中使用。
•扩展表达式匹配标记:匹配常规或扩展表达式,包括文件名或路径规范。它与智能字符串化结果标记一起使用,以确保扩展表达式不会被字符串化,而普通的未引用的字符串文件规范会被字符串化。
•可选匹配子句是匹配模式中用方括号([ ])括起来的部分。它们指定匹配模式中可能缺失的部分。可选子句可以包含在<matchPattern>中允许的任何组件,包括其他可选子句。
可选匹配子句可以出现在匹配模式中的任何位置和任何顺序,并仍然匹配输入文本。每个匹配子句在输入文本中只能出现一次。可选匹配子句有两种类型:一种是关键字后跟匹配标记,另一种是单独的关键字。这两种类型的可选匹配子句可以匹配典型的xBase命令集中的所有传统命令子句。
可选匹配子句使用正则或列表匹配标记进行定义,以便匹配输入文本,如果子句由参数或关键字后跟参数组成(请参阅Std.ch中USE命令的INDEX子句)。如果可选匹配子句仅由关键字本身组成,则使用受限制的匹配标记进行匹配(请参阅Std.ch中USE命令的EXCLUSIVE或SHARED子句)。
在任何匹配模式中,您不能指定仅由匹配标记组成的相邻可选匹配子句,否则会生成编译器错误。您可以在输入文本中重复任意次数的可选子句,只要它不与其他可选子句相邻。要将重复的匹配子句写入结果文本,请在<resultPattern>定义中使用重复的结果子句。