Как мне создать парсер, который будет продолжать синтаксический анализ, пока не будет найден знак доллара? - PullRequest
0 голосов
/ 05 февраля 2019

Я создаю парсер рекурсивного спуска и начинаю очень низко, чтобы понять его.Прямо сейчас мой синтаксический анализатор распознает правильные только две формы операторов: "int x [3];"или "int x;"Мне нужно многократно анализировать, пока не будет найден знак доллара.

Но он будет анализироваться только один раз.Он возвращает true или false для этого первого потока токенов и больше не запускается.Итак, я добавил цикл while в свой конструктор Parser (), думая, что он добьется цели, но он работает вечно, если возвращает false.Мне нужно, чтобы он мог запускать parse_Program () каждый раз, когда конструктор Parser () находится под контролем, если не достигнут знак доллара.Тестовый пример:

`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;
}

}

  public Tokens(String token){
    contents = token;
    if (isNumeric(token)){
        type = "NUM";
    }else if (isAlpha(token)){
        for (int i = 0; i < Main.keywords.size(); i++){
            if (token.equals(Main.keywords.get(i).trim())){
                type = "KEYWORD";
                break;
            }else if (i == Main.keywords.size() - 1){
                type = "ID";
                break;
            }
        }
    }
}

Я ожидал, что он продолжит анализировать и останавливаться, но это не так.Является ли цикл while () неправильным подходом?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...