C++ Flex/Bison句法分析第2部分

C++ Flex/Bison句法分析第2部分,c++,yacc,bison,lexical-analysis,C++,Yacc,Bison,Lexical Analysis,你好 我需要Lex/Yacc编程方面的帮助。我为许多语句的输入编写了一个语法分析编译器。现在我有一个特别的问题 在输入的情况下,编译器给出正确的输出,使用哪个语句,常量运算符或jmp讲师给哪个标签,现在我必须这样写,如果现在出现if语句,首先是第一个命令(在else之前)必须发出当if的赋值为yes时,它必须跳到末尾,因为不需要else后面的命令,所以在这个jmp之后,必须发出第二个命令。我用一个例子来说明,也许你明白我的意思 输入adr。输出 if(x==0) 10 if(x

你好

我需要Lex/Yacc编程方面的帮助。我为许多语句的输入编写了一个语法分析编译器。现在我有一个特别的问题

在输入的情况下,编译器给出正确的输出,使用哪个语句,常量运算符或jmp讲师给哪个标签,现在我必须这样写,如果现在出现if语句,首先是第一个命令(在else之前)必须发出当if的赋值为yes时,它必须跳到末尾,因为不需要else后面的命令,所以在这个jmp之后,必须发出第二个命令。我用一个例子来说明,也许你明白我的意思

输入adr。输出

if(x==0)        10   if(x==0)
Wait 5          20   WAIT 5
else            30   JMP 50
Wait 1          40   WAIT 1
end             50   END
像这样。我有个主意,也许我可以用一个特别的if语句

IF exp jmp_stmt_end stmt_seq END

当输入中给出if语句时,编译器必须识别语句的结尾,就像我的编译器中的jmp_stmt一样(您必须从中下载文件),只需跳到结尾即可。我希望您理解我的问题。谢谢。

我将通过两个阶段的输出来实现这一点:第一阶段将使用每个输出语句生成一个列表,其中跳转目标由标签编码,第二阶段使用该列表生成实际输出。大概是这样的:

通过一项:

Number Label Satatement
10           if(x==0)
20           WAIT 5
30           JMP (A)
40           WAIT 1
50       A   END
+1.这个过程被称为“回接”,虽然它可以在一个过程中完成,但这里提供的两个过程的方法更容易实现,效果也更好。