如何创建将继续解析直到找到美元符号的解析器?

时间:2019-02-05 16:52:37

标签: java compiler-construction

我正在创建一个递归下降解析器,并且从很低的层次开始以了解它。现在,我的解析器将仅识别两种形式的正确语句:“ int x [3];”或“ int x;”。我需要反复分析,直到找到美元符号。

但是,它只会解析一次。对于第一个令牌流,它返回true或false,并且不会再次运行。因此,我向Parser()构造函数添加了一个while循环,认为可以解决问题,但是如果返回false,它将永远运行。我需要它能够每次在构造函数Parser()受控制时都运行parse_Program(),除非达到美元符号。 测试案例:

/dev/urandom/

但是,我的代码没有这样做。如果遇到错误,它将永远打印为错误。

`int var[3];   ---> return true`

`int var;     ---> return true`

`wrongType var;   ---> should return false because wrongType is not a type specifier`

`$`   ----> NOW, my parser should stop.

}

public class Parser {
int n = 0;
Tokens token = Main.TokenList.get(n);

public Parser() {
    while (!token.getContents().equals("$")){
        System.out.println(parse_Program());

    }

}

Boolean parse_Program(){
    if (!parse_DeclarationList()){
         return false;
    }
    return true;
}

private boolean parse_DeclarationList() {
    if (!parse_Declaration()){
        return false;
    }
    return true;
}


private boolean parse_Declaration() {
    if (!parse_varDeclaration()){
        return false;
    }
    return true;
}

private boolean parse_varDeclaration() {
    if (!parse_TypeSpecifier()){
        return false;
    }
    if (token.getType().equals("ID")){
        Accept();
    }else
        return false;
    if (!parse_varDeclarationPrime()){
        return false;
    }
    return true;
}

private boolean parse_varDeclarationPrime() {
    if (token.getContents().equals(";")){
        Accept();
        return true;
    }else if (token.getContents().equals("[")){
        Accept();
        if (token.getType().equals("NUM")){
            Accept();
            if (token.getContents().equals("]")){
                Accept();
                if (token.getContents().equals(";")){
                    Accept();
                    return true;
                }
            }
        }
    }
    return false;
}

private void Accept() {
    if ((n + 1) < Main.TokenList.size()){
        token = Main.TokenList.get(++n);
    }

}

private boolean parse_TypeSpecifier() {
    System.out.println(token.getContents());
    if (token.getContents().equals("int") || token.getContents().equals("float") || token.getContents().equals("void")){
        Accept();
        return true;
    }
    return false;
}

我希望它能够继续解析并停止,但事实并非如此。 while()循环是错误的方法吗?

0 个答案:

没有答案