原生扩展:重要的 NativeCall 机制
SyntaxFlow 的高级关键特性之一是使用 NativeCall 函数。这些函数是预先定义的,可在语言内部提供各种实用功能。本教程将介绍 NativeCall 函数的概念,解释其用法,并提供可用函数的完整列表及其描述。
简介
在 SyntaxFlow 中,NativeCall(原生调用)是预封装的函数,允许用户在规则中执行各种高级操作。这些函数用于操作、检查和转换数据结构,促进高级代码分析和转换任务。通过 NativeCall,用户无需编写复杂的逻辑即可实现复杂的数据处理需求,大大提升了 SyntaxFlow 的灵活性和功能性。
NativeCall 语法定义
NativeCall 的语法结构如下:
<nativeCallName(arg1, argName="value", ...)>
其中:
<
:标记 NativeCall 的开始。nativeCallName
:要使用的 NativeCall 函数名称。(...)
:包含函数参数的圆括号。>
:标记 NativeCall 的结束。
完整的 eBNF 描述
nativeCall
: '<' useNativeCall '>'
;
useNativeCall
: identifier useDefCalcParams?
;
useDefCalcParams
: '{' nativeCallActualParams? '}'
| '(' nativeCallActualParams? ')'
;
nativeCallActualParams
: lines? nativeCallActualParam (',' lines? nativeCallActualParam)* ','? lines?
;
nativeCallActualParam
: (nativeCallActualParamKey (':' | '='))? nativeCallActualParamValue
;
nativeCallActualParamKey
: identifier
;
nativeCallActualParamValue
: identifier | numberLiteral | '`' ~'`'* '`' | '$' identifier | hereDoc
;
NativeCall 函数列表
下表列出了 SyntaxFlow 中所有可用的 NativeCall 函数,以及它们的描述:
函数名称 | 描述 |
---|---|
<getReturns> | 获取函数或方法的返回值。 |
<getFormalParams> | 检索函数或方法的形式参数。 |
<getFunc> | 查找包含特定指令或值的当前函数。 |
<getCall> | 获取一个值的调用,通常用于获取与操作码相关的调用。 |
<getCaller> | 查找包含特定值的调用指令。 |
<searchFunc> | 在整个程序中搜索对某个函数的调用。如果输入已经是调用,则搜索该方法(函数)的其他调用。 |
<getObject> | 获取与值关联的对象,通常用于面向对象的上下文中。 |
<getMembers> | 获取对象或类的成员变量或方法。 |
<getSiblings> | 检索代码结构中兄弟节点或值。 |
<typeName> | 获取值的类型名称(不含包路径)。 |
<fullTypeName> | 获取值的完整类型名称(包括包路径)。 |
<name> | 获取函数、方法、变量或类型的名称。 |
<string> | 将值转换为其字符串表示形式。 |
<include> | 包含一个外部文件或资源中的 SyntaxFlow 规则。 |
<eval> | 评估一个作为字符串提供的新 SyntaxFlow 规则。 |
<fuzztag> | 评估一个 Yaklang 的 fuzztag 模板,利用 SFFrameResult 中的变量。 |
<show> | 输出值而不执行任何操作(用于调试)。 |
<slice> | 从值中提取一个切片,类似于数组或字符串的切片操作。使用示例:<slice(start=0)> 。 |
<regexp> | 对字符串执行正则表达式匹配或提取。支持捕获组。示例:<regexp(pattern="\d+", group=1)> 。 |
<strlower> | 将字符串转换为小写。 |
<strupper> | 将字符串转换为大写。 |
<var> | 将值赋给变量以供后续使用。 |
<mybatisSink> | 在代码分析中识别 MyBatis 的 Sink(特定于 Java MyBatis 框架)。 |
<freeMarkerSink> | 识别 FreeMarker 的 Sink(特定于 FreeMarker 模板引擎)。 |
<opcodes> | 获取与值关联的操作码(opcode)。 |
<sourceCode> | 获取值的源代码表示形式。 |
<scanPrevious> | 扫描相对于给定值的前一个操作码或指令。 |
<scanNext> | 扫描给定值之后的下一个操作码或指令。 |
<delete> | 从当前上下文中删除变量或值。 |
<forbid> | 将值标记为禁止;如果该值存在,将报告严重错误。 |
<self> | 获取当前值本身(用于链式操作中)。 |
<dataflow> | 获取与值相关的数据流信息。在流操作符 --> 或 #-> 之后使用。 |
<const> | 在代码中搜索常量值。 |
<versionIn> | 判断依赖版本是否在某个版本区间。 |
注意:上述函数列表是逐步演进的,可能并不包含全部的 NativeCall 函数。用户可以参考源码和相关规则了解更多未覆盖的 NativeCall 使用方法。在后续的案例中,我们会逐步为大家讲解 NativeCall 中的内容究竟都是如何使用的。
使用实例与解释
通过具体的代码案例,结合 SyntaxFlow 的 NativeCall 函数,可以更直观地理解其应用。