实验步骤
- 确定符号栈与状态栈的实现方式, 实现
loadTokens与loadLRTable - 编写
run
提示
在处理符号栈时, 我们可能希望将 Token 和 NonTerminal 同时装在栈中. 但 Token 和 NonTerminal 并没有共同祖先类(除了Object). 我们当然可以使用 Stack<Object>, 但其在使用中有诸多不便. 于是我们期望有一个类似 Union<Token, NonTerminal> 的结构, 就可以将栈定义为: Stack<Union<Token, NonTerminal>>. 因为我们只将 Union 在这里使用一次, 我们可以简单定义一个 Symbol 来实现 Union<Token, NonTerminal> 的功能
下面给出一个 Symbol 的简单实现示例:
class Symbol{
Token token;
NonTerminal nonTerminal;
private Symbol(Token token, NonTerminal nonTerminal){
this.token = token;
this.nonTerminal = nonTerminal;
}
public Symbol(Token token){
this(token, null);
}
public Symbol(NonTerminal nonTerminal){
this(null, nonTerminal);
}
public isToken(){
return this.token != null;
}
public isNonterminal(){
return this.nonTerminal != null;
}
}