exprparser.java

来自「国外的数据结构与算法分析用书」· Java 代码 · 共 71 行

JAVA
71
字号
/**	Class that parses an expression to build an expression tree */
public class ExprParser
{    
	/**	Scanner shared by all ExprTrees for current expression */
	public ExprScanner scanner;
    
	/**	Create the parser and initialize the scanner. <br>
		Analysis: Time = O(1) */
	public ExprParser(ExprScanner scanner)
	{
		this.scanner = scanner;
	}
    
	/**	Read and build expression tree for an identifier
		Analysis: Time = O(1) */
	public ExprTree identifier()
	{
		scanner.getToken();
		return  new ExprTree(null, scanner.token, null);
	}
    
	/**	Read and build expression tree for a factor.
			<factor> ::= <identifier> | ( <expr> ) ; 
		Analysis: Time = O(n), n = number of characters in the factor */
	public ExprTree factor()
	{
		scanner.getToken();
		if (!scanner.token.equals("("))
			return new ExprTree(null, scanner.token, null);
		else
		{
			ExprTree result = expr();  // expr() reads the ")"
			return result;
		}
	}
    
	/**	Read and build expression tree for a term with one look-ahead token. 
			<term> ::= <factor> | <factor> * <term> | <factor> / <term>
		Analysis: Time = O(n), n = number of characters in the term */
	public ExprTree term()
	{
		ExprTree leftSubtree = factor();
		scanner.getToken();
		Object operator = scanner.token;
		if (!operator.equals("*") & !operator.equals("/"))
			return leftSubtree; //	leftSubtree is the whole term
		else
		{
			ExprTree rightSubtree = term(); // term() reads the next token after the term
			return new ExprTree(leftSubtree, operator, rightSubtree);
		}
	}

	/**	Read and build expression tree for an expr with one look-ahead token. 
			<expr> ::= <term> | <term> + <expr> | <term> - <expr> 
		Analysis: Time = O(n), n = number of characters in the expression */
	public ExprTree expr()
	{
		ExprTree leftSubtree = term(); // term() reads the next token after the term
		Object operator = scanner.token;
		
		if (!operator.equals("+") & !operator.equals("-"))
			return leftSubtree; // leftSubtree is the whole expr
		else
		{
			ExprTree rightSubtree = expr(); // expr() reads the next token after the expression
			return new ExprTree(leftSubtree, operator, rightSubtree);
		}
	}
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?