如何在lex和yacc中实现跳转指令

时间:2016-11-16 03:44:16

标签: compiler-construction yacc lex

我想实施

             DJNZ R1,LABEL

这意味着如果递减的结果不为零,则递减R1并跳转到LABEL。

我有lex文件,它生成令牌DJNZ,REG和LABEL。

在yacc文件中我有:

     Jump_instr: DJNZ REG ',' LABEL    {regmem[regIdx] = regmem[regIdx] -1;                                       
                                             if (regmem[regIdx] != 0)
                                              { goto label;}}

我不确定该怎么办。有任何建议请。

1 个答案:

答案 0 :(得分:0)

当您的解析器遇到标签时,您需要使用相应的指令指针将其添加到哈希表(通常称为符号表)。由于这似乎是没有AST的解释器,因此您的指令指针将是标签后第一条指令的第一个字符的索引(有关获取令牌位置的一种可能方法,请参阅this answer) 。到"跳"然后,在符号表中查找该标签,然后在该索引处重新启动解释器。您无法使用C标签执行此操作,因为在编译解释器时必须知道它们。

另外,就目前情况而言,您的口译员只能向后跳。您可以通过运行两次传递来处理前向跳转:第一次构建符号表,第二次实际执行每条指令。