0

我正在实现一个基于 javacc 的解析器,它将能够处理 GW Basic 程序。

我像这样实现了for循环

void forloop(Token line):
{
    Token toV;
    Token toI;
    Token step;
    Token next;
    Token var;
}
{
    <FOR> var=<VARIABLE> "=" Expression() { instructions.add("STORE " + var.image); } <TO> toV=<INTEGER> <STEP> step=<INTEGER> 
    {   
        instructions.add("LABEL "+labelsCntr);
        instructions.add("LOAD "+var.image);
        instructions.add("CONST "+toV.image);
        instructions.add("SUB");
        instructions.add("CONST 0");

    }
    ( Line() )*
    next = <INTEGER> <NEXT> <VARIABLE>
    {
        instructions.add("LINE "+next.image);
        instructions.add("LOAD "+step.image);
        instructions.add("LOAD "+var.image);
        instructions.add("ADD");
        instructions.add("JMP LABEL "+(labelsCntr));

        labelsCntr++;

    }    
}

但它不起作用。

如何实现 for 循环以使其正常工作。

或者我做错了什么。

提前致谢。

4

1 回答 1

2

在您的机器代码中,有两件事是我所期望的。一种是有条件的跳出循环。当变量超过 toV 时,控制应该跳转到循环后的第一条指令。其次,我看不到 var 在哪里更改。在循环结束时,您将变量的值添加到步长值,但您不会将结果存储回变量中。

还有一些我预计需要在编译时完成的检查缺失:NEXT 语句中的变量与 VAR 中的变量匹配,并且该步骤是肯定的。

于 2013-06-18T22:49:17.227 回答