我正在创建一个递归下降解析器,并且从很低的层次开始以了解它。现在,我的解析器将仅识别两种形式的正确语句:“ 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()循环是错误的方法吗?