我正在尝试分析 Java 代码结构。
所以,我通过使用 ANTLRv3 和 java 语法代码生成了一个 Java 解析器和词法分析器......
但我不知道如何使用生成的解析器和词法分析器生成上下文流图。
我试图通过教程页面学习如何做到这一点,但教程页面已经消失了。
你能给我一个如何做到这一点的方法吗?或教程页面?
谢谢你。
对于上下文,我试图将AVM2(ActionScript虚拟机2)字节码/汇编中的反编译器编写为高级ActionScript 3代码.据我所知,这需要我分析程序集并从中生成结果控制流图,以便推导出诸如循环和条件分支(if/else)之类的结构.
鉴于一些组装如下:
0 getlocal0
1 pushscope
2 findpropstrict {, private, }::trace
4 pushstring "one"
6 callproperty {, private, }::trace (1)
9 pop
10 pushbyte 5
12 pushbyte 3
14 ifngt L1
18 findpropstrict {, private, }::trace
20 pushstring "two"
22 callproperty {, private, }::trace (1)
25 pop
L1:
26 findpropstrict {, private, }::trace
28 pushstring "three"
30 callproperty {, private, }::trace (1)
33 coerce_a
34 setlocal1
35 getlocal1
36 returnvalue
37 kill 1
Run Code Online (Sandbox Code Playgroud)
什么是生成控制流图的算法?
assembly computer-science decompiling control-flow control-flow-graph
我想从以JSON格式给出的AST构建控制流图(CFG).所以这个AST是在TouchDevelop中针对每个脚本自动创建的.而且由于TouchDevelop不是面向对象的编程,我还可以使用访问者模式吗?任何有用的指针将不胜感激.
Update1:我的问题是我不明白从哪里开始.从互联网上,我应该使用访问者模式来浏览AST以访问每个节点并收集信息.从那里,我可以构建一个CFG,然后进行数据流分析.但有两个问题:
1)据我所知,我需要面向对象的编程模型,使用访问者模式,(我可能是错的),这TouchDevelop不是.
2)如下所示,AST不是AST格式,正如我在互联网上找到的那样.它是JSON格式.我想我可以解析JSON将其转换为所需的AST结构,但我不太确定.
示例脚本的源代码
meta version "v2.2,nothing";
meta name "DivideByZero";
//
meta platform "current";
action main() {
(5 / 0)?post_to_wall;
}
Run Code Online (Sandbox Code Playgroud)
产生的AST(JSON格式)如下:
{
"type":"app",
"version":"v2.2,nothing",
"name":"DivideByZero",
"icon":null,
"color":null,
"comment":"",
"things":[
{
"type":"action",
"name":"main",
"isEvent":false,
"outParameters":[
],
"inParameters":[
],
"body":[
{
"type":"exprStmt",
"tokens":[
{
"type":"operator",
"data":"("
},
{
"type":"operator",
"data":"5"
},
{
"type":"operator",
"data":"/"
},
{
"type":"operator",
"data":"0"
},
{
"type":"operator",
"data":")"
},
{
"type":"propertyRef",
"data":"post to wall"
}
]
}
],
"isPrivate":false
}
]
}
Run Code Online (Sandbox Code Playgroud) procedural-programming static-analysis abstract-syntax-tree touchdevelop control-flow-graph
我正在尝试了解 SPIR-V 规范,例如了解 for 循环。在 1.6 修订版 2 规范的开头,有以下示例(为了一致性,仅取部分内容)
for (int i = 0; i < 4; ++i)
color *= multiplier;
Run Code Online (Sandbox Code Playgroud)
变成:
%49 = OpLabel
OpLoopMerge %51 %52 None ; structured loop
OpBranch %53
%53 = OpLabel
%54 = OpLoad %16 %48
%56 = OpSLessThan %25 %54 %55 ; i < 4 ?
OpBranchConditional %56 %50 %51 ; body or break
%50 = OpLabel ; body
%58 = OpLoad %7 %57
%59 = OpLoad %7 %31
%60 = OpFMul %7 …Run Code Online (Sandbox Code Playgroud) 我正在开发一个编译器项目,想知道控制流图(CFG )的“基本块”的含义和实现。他们说基本块是用于没有任何分支的线性步骤序列。但首先,有几个问题:
例如,假设我有这个:
let a = 10;
let b = 0;
if ((foo() && bar()) || baz()) {
b = 20;
if (hello > world) {
b *= 3
}
} else {
b = 2 * a;
}
let c = a * b
log(a);
Run Code Online (Sandbox Code Playgroud)
这里,什么是“基本块”?
const blocks = [
{
inputs: [],
statements: [
'let a = 10',
'let b = 0',
],
outputs: ['a', 'b']
},
{
// ...?
}
]
Run Code Online (Sandbox Code Playgroud)
我不是问如何准确地实现数据流分析器,只是粗略地说在这样的示例中块应该是什么?一些伪代码会有所帮助。条件表达式 …
control-flow ×2
antlr ×1
assembly ×1
bytecode ×1
decompiling ×1
if-statement ×1
java ×1
jvm ×1
parsing ×1
spir-v ×1
touchdevelop ×1
vulkan ×1
while-loop ×1