抽象语法树(Abstract Syntax Tree)

使用Ethers ASM Dialect去解析文件将生成一个抽象语法树。 根节点将始终是name为_ScopeNode

要将文件解析为抽象语法树,请使用parse函数。

类型

位置(Location)

offset number

源代码中到此节点的开始处的偏移量。

length number

源代码中到此节点末尾的字符长度。

source string

此节点的源代码。

节点(Nodes)

@TODO: 在这里放置一个显示层次结构的图表

节点

node.tag string

程序生命周期中此节点的唯一标记。

node.location 位置(Location)

此节点所表示的源代码,和该节点在源代码中的位置(location)。

ValueNode inherits 节点

一个 ValueNode(值节点) 是一个可以操作堆栈的节点。

LiteralNode inherits ValueNode

literalNode.value string

此节点的文字值,可以是DataHexString或十进制数的字符串。

literalNode.verbatim boolean

DataNode上下文中,这是true, 因为在这种情况下,值应该逐字取,不应该添加PUSH操作,否则为false。

PopNode inherits ValueNode

PopNode用于存储栈中隐式弹出的占位符。 它表示隐式占位符(例如$$)或显式占位符(例如$1)的代码,它表示要预期要使用的堆栈位置。

literalNode.index number

这个PopNode所代表的索引。对于隐式占位符是0

LinkNode inherits ValueNode

LinkNode(链接节点) 表示到另一个节点数据的链接,例如$foo#bar

linkNode.label string

目标节点的名称。

linkNode.type "offset" | "length"

表示此节点是用于目标节点的偏移值还是长度值。

OpcodeNode inherits ValueNode

opcodeNode.opcode 操作码(Opcode)

此节点的操作码。

opcodeNode.operands Array< ValueNode >

传递到此节点的所有操作数(operands)的列表。

EvaluationNode inherits ValueNode

EvaluationNode用于执行代码和插入结果,但不生成任何输出程序集,使用{{! code here }}语法。

literalNode.verbatim boolean

DataNode上下文中,这是true, 因为在这种情况下,值应该逐字取,不应该添加PUSH操作,否则为false。

evaluationNode.script string

一段用于计算和生成结果以作为文字使用的代码。

ExecutionNode inherits 节点

ExecutionNode 用于执行代码,但不生成任何输出程序集,使用{{! code here }}语法。

evaluationNode.script string

要执行的代码。任何结果(result)都会被忽略。

LabelledNode inherits 节点

LabelledNode用于任何具有name的节点,因此可以作为LinkNode的目标。

labelledNode.name string

节点的名称。

LabelNode inherits LabelledNode

通过使用@myLabel:引用name,LabelNode将被用作要跳转的位置。 自动在字节码偏移处插入一个JUMPDEST

DataNode inherits LabelledNode

DataNode允许数据直接插入到输出程序集中,使用@myData[ ... ]。 如果需要则对数据进行填充,以确保原本被视为PUSH值的值不会影响数据以外的任何内容。

dataNode.data Array< ValueNode >

子节点,代表逐字插入的一段数据。

ScopeNode inherits LabelledNode

ScopeNode允许一个新的引用框架,所有LinkNode在解析偏移位置时都会使用这个引用框架,使用@myScope{ ... }

scopeNode.statements Array< 节点 >

此作用域的子节点列表。