跳转标签分析和生成是什么编译器技术?
What compiler technology does jump label analysis and generation?
我正在从事一个小型编译器项目,该项目涉及在最终代码中生成跳转标签。
我不确定具体的编译器技术、问题属于什么等等,我什至不确定如何google引用。
希望大家指点方向
编译代码如下:
goto A
-- some optional code
-- may be here
A: if (2 > 1)
print Y
else
print N
我的输入是上面代码的AST:
Node if, label A
child1 condition
child11 expr 2 > 1
child2 body
child21 print Y
child3 else
child31 print N
问题是,在代码生成阶段之前,我需要将 "label A" 从 "Node if" 传播到 "child11"。
我还以为这是Static Single Assignment, SSA, analysis and transformation的一部分,看了一个lecture note,没看出来
希望大家帮帮忙。
快速简短回答
首先查找 "intermediate code" 生成阶段。一些编译器不使用它,也没有记录。您将需要它来实现 "goto".
长扩展答案
goto、label语句,在代码生成步骤中被转换,之后A.S.T.
的一代
请记住,构建编译器或解释器有多种技术,并且可能因项目而异。
在这种特殊情况下,在构建 A.S.T. 之后,会从 A.S.T.
构建一个名为 "intermediate code" 的结构
通常,是简单指令的列表,具有单个操作和一些参数。
(97) goto 100
(98) do something
(99) do something
(100) ifgreater 2, 1
(101) then print n
(102) else print y
许多代码行可以从 AST 转换为最终代码,"goto" 不能。
如果在"goto"之后声明了标签,则需要将"goto"生成为"goto temp1",作为中间指令,生成以下几行,包含在标签所在的地方宣布。
(97) goto temp1
(98) do something
(99) do something
(100) ifgreater 2, 1
(101) then print n
(102) else print y
之后,return 将 "temp1" 替换为实际行号。
(97) goto 100
(98) do something
(99) do something
(100) ifgreater 2, 1
(101) then print n
(102) else print y
然后,将此中间代码转换为最终(目标)代码。
我正在从事一个小型编译器项目,该项目涉及在最终代码中生成跳转标签。
我不确定具体的编译器技术、问题属于什么等等,我什至不确定如何google引用。
希望大家指点方向
编译代码如下:
goto A
-- some optional code
-- may be here
A: if (2 > 1)
print Y
else
print N
我的输入是上面代码的AST:
Node if, label A
child1 condition
child11 expr 2 > 1
child2 body
child21 print Y
child3 else
child31 print N
问题是,在代码生成阶段之前,我需要将 "label A" 从 "Node if" 传播到 "child11"。
我还以为这是Static Single Assignment, SSA, analysis and transformation的一部分,看了一个lecture note,没看出来
希望大家帮帮忙。
快速简短回答
首先查找 "intermediate code" 生成阶段。一些编译器不使用它,也没有记录。您将需要它来实现 "goto".
长扩展答案
goto、label语句,在代码生成步骤中被转换,之后A.S.T.
的一代请记住,构建编译器或解释器有多种技术,并且可能因项目而异。
在这种特殊情况下,在构建 A.S.T. 之后,会从 A.S.T.
构建一个名为 "intermediate code" 的结构通常,是简单指令的列表,具有单个操作和一些参数。
(97) goto 100
(98) do something
(99) do something
(100) ifgreater 2, 1
(101) then print n
(102) else print y
许多代码行可以从 AST 转换为最终代码,"goto" 不能。
如果在"goto"之后声明了标签,则需要将"goto"生成为"goto temp1",作为中间指令,生成以下几行,包含在标签所在的地方宣布。
(97) goto temp1
(98) do something
(99) do something
(100) ifgreater 2, 1
(101) then print n
(102) else print y
之后,return 将 "temp1" 替换为实际行号。
(97) goto 100
(98) do something
(99) do something
(100) ifgreater 2, 1
(101) then print n
(102) else print y
然后,将此中间代码转换为最终(目标)代码。