Я создаю парсер рекурсивного спуска и начинаю очень низко, чтобы понять его.Прямо сейчас мой синтаксический анализатор распознает правильные только две формы операторов: "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 () неправильным подходом?