编译与查询
这个页面对应“手动测试和规则编写测试”场景。
目标很简单:先把项目编译成 Program,再执行你自己的 SyntaxFlow 规则,看到明确的命中位置和数据流变量。
实测说明(2026-03-04):本页命令和输出示例已在
syntaxflow-zero-to-hero/lesson-1-hello-world跑通。
1. 从零开始(Hello World)
1.1 克隆示例项目
git clone https://github.com/yaklang/syntaxflow-zero-to-hero
cd syntaxflow-zero-to-hero/lesson-1-hello-world/
这个目录里有两份关键文件:
HelloWorld.java:待分析代码lesson-1.sf:示例规则
1.2 编译项目
yak ssa-compile -t . -p lesson1 -l java --re-compile
参数含义:
-t .:当前目录作为分析目标-p lesson1:Program 名称,后续查询时要复用-l java:指定语言--re-compile:同名 Program 允许重编译
1.3 你会看到什么输出
正常情况下会看到类似日志(节选):
[INFO] [ssa-compile] compile stage: target="." program="lesson1" language="java"
[INFO] start to compile file: .
[INFO] compile save to database with program name: lesson1
...
[INFO] program lesson1 finish: 1.000000
[INFO] finished compiling..., results: 1
你可以这样判断是否成功:
- 出现
finished compiling..., results: 1 - 没有
parse project failed或no program compiled这类错误
2. 执行 SyntaxFlow 查询
2.1 使用 ssa-query
yak ssa-query -p lesson1 --sf lesson-1.sf
等价命令:
yak sf -p lesson1 --sf lesson-1.sf