我想实施
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;}}
我不确定该怎么办。有任何建议请。
答案 0 :(得分:0)
当您的解析器遇到标签时,您需要使用相应的指令指针将其添加到哈希表(通常称为符号表)。由于这似乎是没有AST的解释器,因此您的指令指针将是标签后第一条指令的第一个字符的索引(有关获取令牌位置的一种可能方法,请参阅this answer) 。到"跳"然后,在符号表中查找该标签,然后在该索引处重新启动解释器。您无法使用C标签执行此操作,因为在编译解释器时必须知道它们。
另外,就目前情况而言,您的口译员只能向后跳。您可以通过运行两次传递来处理前向跳转:第一次构建符号表,第二次实际执行每条指令。