Java 递归下降解析器堆栈溢出
我有以下解析器代码,该解析器接受链表作为父类的参数。在我输入表达式后,它抛出堆栈溢出错误 我从Swing GUI类中的jTextField传递输入表达式,然后将布尔结果返回给同一类中的jLabel。什么可能导致堆栈溢出错误?请帮忙,谢谢 输入示例: 1+2+3 (1+2)/(3+4)Java 递归下降解析器堆栈溢出,java,parsing,stack-overflow,recursive-descent,Java,Parsing,Stack Overflow,Recursive Descent,我有以下解析器代码,该解析器接受链表作为父类的参数。在我输入表达式后,它抛出堆栈溢出错误 我从Swing GUI类中的jTextField传递输入表达式,然后将布尔结果返回给同一类中的jLabel。什么可能导致堆栈溢出错误?请帮忙,谢谢 输入示例: 1+2+3 (1+2)/(3+4) import java.util.LinkedList; 类令牌{ 公共静态最终整数加上_减=0; 公共静态最终整数乘除=1; 公共静态最终整数指数=2; 公共静态最终整数=3; 公共静态最终整数标识符=4; 公共
import java.util.LinkedList;
类令牌{
公共静态最终整数加上_减=0;
公共静态最终整数乘除=1;
公共静态最终整数指数=2;
公共静态最终整数=3;
公共静态最终整数标识符=4;
公共静态最终int OPEN=5;
公共静态最终int CLOSE=6;
//公共静态最终整数负=7;
public final int token;//每个token保存数据的字段
公共最终字符串序列;
公共令牌(整数令牌、字符串序列){
超级();
this.token=token;
这个序列=序列;
}
}
公共类解析器{
私有令牌下一个;//下一个令牌的指针
私有LinkedList令牌;//令牌生成器生成的令牌列表
专用整数计数器=0;
公共解析器(LinkedList令牌)
{
this.tokens=(LinkedList)tokens.clone();//获取LinkedList
this.tokens.getFirst();//分配LINKEDLIST的第一个元素
}
////////解析方法的开始////////
/*
语法:
E->E+T | E-T | T |-E
T->T*X | T/X | X
X->X^F | F
F->(E)|编号|标识符
F->(E)| N | I
N->D | ND
I->标识符
*/
公共布尔解析()
{
返回E();//调用开始符号
}
私有布尔项(int标记)//获取下一个标记
{
布尔标志=假;
if(next.token==令牌)
flag=true;
计数器+++;//递增计数器
if(counterE+T | E-T | T |-E////////
私有布尔E()
{
返回E1()| E2()| E3();
}
私有布尔E1()
{
//E->E+T | E-T
int标志=计数器;
布尔结果=真;
if(!(E()&&term(Token.PLUS_减号)&&T())
{
计数器=标志;//回溯
if(counterT
int标志=计数器;
布尔结果=真;
如果(!T())
{
计数器=标志;//回溯
if(counter-E
int标志=计数器;
布尔结果=真;
if(!(术语(标记加减)和&E())
{
计数器=标志;//回溯
if(counterT*X | T/X | X////////
私有布尔T()
{
返回T1()| T2();
}
私有布尔T1()
{
//T->T*X | T/X
int标志=计数器;
布尔结果=真;
if(!(T()&&term(Token.MULTIPLY\u DIVIDE)&&X())
{
计数器=标志;//回溯
if(counterX
int标志=计数器;
布尔结果=真;
如果(!X())
{
计数器=标志;//回溯
if(counterX^F | F////////
私有布尔X()
{
返回X1()| X2();
}
私有布尔X1()
{
//X->X^F
int标志=计数器;
布尔结果=真;
if(!(X()&&term(Token.EXPONENT)&&F())
{
计数器=标志;//回溯
if(counterF
int标志=计数器;
布尔结果=真;
如果(!F())
{
计数器=标志;//回溯
if(counter(E)|编号|标识符////////
私有布尔F()
{
返回F1()| | F2()| | F3();
}
私有布尔F1()
{
//F->(E)
int标志=计数器;
布尔结果=真;
if(!(term(Token.OPEN)和&E()&&term(Token.CLOSE)))
{
计数器=标志;//回溯
if(counter数字
int标志=计数器;
布尔结果=真;
如果(!术语(标记号))
{
计数器=标志;//回溯
if(counterimport java.util.LinkedList;
class Token {
public static final int PLUS_MINUS = 0;
public static final int MULTIPLY_DIVIDE = 1;
public static final int EXPONENT = 2;
public static final int NUMBER = 3;
public static final int IDENTIFIER = 4;
public static final int OPEN = 5;
public static final int CLOSE = 6;
//public static final int NEGATIVE = 7;
public final int token; // FIELDS TO HOLD DATA PER TOKEN
public final String sequence;
public Token (int token, String sequence) {
super();
this.token = token;
this.sequence = sequence;
}
}
public class Parser {
private Token next; // POINTER FOR NEXT TOKEN
private LinkedList<Token> tokens; // LIST OF TOKENS PRODUCED BY TOKENIZER
private int counter = 0;
public Parser(LinkedList tokens)
{
this.tokens = (LinkedList<Token>) tokens.clone(); // GET LINKEDLIST
this.tokens.getFirst(); // ASSIGNS FIRST ELEMENT OF LINKEDLIST
}
//////// START OF PARSING METHODS ////////
/*
GRAMMAR:
E -> E+T | E-T | T | -E
T -> T*X | T/X | X
X -> X^F | F
F -> (E) | NUMBERS | IDENTIFIERS
F -> (E) | N | I
N -> D | ND
I -> IDENTIFIERS
*/
public boolean Parse ()
{
return E(); // INVOKE START SYMBOL
}
private boolean term (int token) // GETS NEXT TOKEN
{
boolean flag = false;
if(next.token == token)
flag = true;
counter++; // INCREMENT COUNTER
if(counter < tokens.size()) // POINT TO NEXT TOKEN
next = tokens.get(counter);
return flag;
}
///////// START OF LIST OF PRODUCTIONS /////////
//////// E -> E+T | E-T | T | -E ////////
private boolean E()
{
return E1() || E2() || E3();
}
private boolean E1 ()
{
// E -> E+T | E-T
int flag = counter;
boolean result = true;
if(!(E() && term(Token.PLUS_MINUS) && T() ))
{
counter = flag; // BACKTRACK
if(counter < tokens.size()) // POINT TO PREVIOUS TOKEN
next = tokens.get(counter);
result = false;
}
return result;
}
private boolean E2 ()
{
// E -> T
int flag = counter;
boolean result = true;
if(!T())
{
counter = flag; // BACKTRACK
if(counter < tokens.size()) // POINT TO PREVIOUS TOKEN
next = tokens.get(counter);
result = false;
}
return result;
}
private boolean E3 ()
{
// E -> -E
int flag = counter;
boolean result = true;
if(!(term(Token.PLUS_MINUS) && E() ))
{
counter = flag; // BACKTRACK
if(counter < tokens.size()) // POINT TO PREVIOUS TOKEN
next = tokens.get(counter);
result = false;
}
return result;
}
//////// T -> T*X | T/X | X ////////
private boolean T()
{
return T1() || T2();
}
private boolean T1 ()
{
// T -> T*X | T/X
int flag = counter;
boolean result = true;
if(!(T() && term(Token.MULTIPLY_DIVIDE) && X() ))
{
counter = flag; // BACKTRACK
if(counter < tokens.size()) // POINT TO PREVIOUS TOKEN
next = tokens.get(counter);
result = false;
}
return result;
}
private boolean T2 ()
{
// T -> X
int flag = counter;
boolean result = true;
if(!X())
{
counter = flag; // BACKTRACK
if(counter < tokens.size()) // POINT TO PREVIOUS TOKEN
next = tokens.get(counter);
result = false;
}
return result;
}
//////// X -> X^F | F ////////
private boolean X()
{
return X1() || X2();
}
private boolean X1()
{
// X-> X^F
int flag = counter;
boolean result = true;
if(!(X() && term(Token.EXPONENT) && F()))
{
counter = flag; // BACKTRACK
if(counter < tokens.size()) // POINT TO PREVIOUS TOKEN
next = tokens.get(counter);
result = false;
}
return result;
}
private boolean X2()
{
// X-> F
int flag = counter;
boolean result = true;
if(!F())
{
counter = flag; // BACKTRACK
if(counter < tokens.size()) // POINT TO PREVIOUS TOKEN
next = tokens.get(counter);
result = false;
}
return result;
}
//////// F -> (E) | NUMBERS | IDENTIFIERS ////////
private boolean F()
{
return F1() || F2() || F3();
}
private boolean F1()
{
// F -> (E)
int flag = counter;
boolean result = true;
if(!(term(Token.OPEN) && E() && term(Token.CLOSE)))
{
counter = flag; // BACKTRACK
if(counter < tokens.size()) // POINT TO PREVIOUS TOKEN
next = tokens.get(counter);
result = false;
}
return result;
}
private boolean F2()
{
// F -> NUMBERS
int flag = counter;
boolean result = true;
if(!term(Token.NUMBER))
{
counter = flag; // BACKTRACK
if(counter < tokens.size()) // POINT TO PREVIOUS TOKEN
next = tokens.get(counter);
result = false;
}
return result;
}
private boolean F3()
{
// F -> IDENTIFIERS
int flag = counter;
boolean result = true;
if(!term(Token.IDENTIFIER))
{
counter = flag; // BACKTRACK
if(counter < tokens.size()) // POINT TO PREVIOUS TOKEN
next = tokens.get(counter);
result = false;
}
return result;
}
}
public boolean Parse() {
return E(); // INVOKE START SYMBOL
}
private boolean E() {
return E1() || E2() || E3();
}
private boolean E1 () {
// E -> E+T | E-T
int flag = counter;
boolean result = true;
if(!(E() && term(Token.PLUS_MINUS) && T() )) {
counter = flag; // BACKTRACK
...