使用Ethers ASM Dialect去解析文件将生成一个抽象语法树。 根节点将始终是name为_
的ScopeNode。
要将文件解析为抽象语法树,请使用parse函数。
源代码中到此节点的开始处的偏移量。
源代码中到此节点末尾的字符长度。
此节点的源代码。
@TODO: 在这里放置一个显示层次结构的图表
节点
程序生命周期中此节点的唯一标记。
此节点所表示的源代码,和该节点在源代码中的位置(location)。
一个 ValueNode(值节点) 是一个可以操作堆栈的节点。
此节点的文字值,可以是DataHexString或十进制数的字符串。
在DataNode上下文中,这是true, 因为在这种情况下,值应该逐字取,不应该添加PUSH
操作,否则为false。
PopNode用于存储栈中隐式弹出的占位符。 它表示隐式占位符(例如$$
)或显式占位符(例如$1
)的代码,它表示要预期要使用的堆栈位置。
这个PopNode所代表的索引。对于隐式占位符是0
。
LinkNode(链接节点) 表示到另一个节点数据的链接,例如$foo
或#bar
。
目标节点的名称。
表示此节点是用于目标节点的偏移值还是长度值。
此节点的操作码。
传递到此节点的所有操作数(operands)的列表。
EvaluationNode用于执行代码和插入结果,但不生成任何输出程序集,使用{{! code here }}
语法。
在DataNode上下文中,这是true, 因为在这种情况下,值应该逐字取,不应该添加PUSH
操作,否则为false。
一段用于计算和生成结果以作为文字使用的代码。
ExecutionNode 用于执行代码,但不生成任何输出程序集,使用{{! code here }}
语法。
要执行的代码。任何结果(result)都会被忽略。
LabelledNode用于任何具有name的节点,因此可以作为LinkNode的目标。
节点的名称。
LabelNode inherits LabelledNode
通过使用@myLabel:
引用name,LabelNode将被用作要跳转的位置。 自动在字节码偏移处插入一个JUMPDEST
。
DataNode inherits LabelledNode
DataNode允许数据直接插入到输出程序集中,使用@myData[ ... ]
。 如果需要则对数据进行填充,以确保原本被视为PUSH
值的值不会影响数据以外的任何内容。
子节点,代表逐字插入的一段数据。
ScopeNode inherits LabelledNode
ScopeNode允许一个新的引用框架,所有LinkNode在解析偏移位置时都会使用这个引用框架,使用@myScope{ ... }
。
此作用域的子节点列表。