⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 parser.java

📁 实验软装置(基于表达式的计算器ExprEval) 很不错的 有帮助于学习提高
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
package parser;
import exceptions.*;
import scanner.*;

import java.io.*;
public class Parser {

	/**
	 * scanner
	 */
	Scanner scanner;
	/**
	 * parser table
	 */
	ParserTable parserTable;
	/**
	 * stack for symbols
	 */
	Symbol stack[];
	/**
	 * lookahead
	 */
	Token lookahead;
	/**
	 * final expression
	 */
	Expression fin;
	/**
	 * top of stack
	 */
	int top;
	/**
	 * constructor
	 *
	 */
	public Parser()
	{
		parserTable=new ParserTable();
	}
	
	
	/**
	 * accept
	 *
	 */
	private void accept()
	{
		fin=(Expression)(stack[1]);
	}

	/**
	 * get topmost token of stack
	 * @return top of stack
	 * @throws ExpressionException
	 */
	private int getTop() throws ExpressionException
	{
		if(top==0){
			throw new exceptions.MissingOperandException();
		}
		int tmp=top-1;
		for(tmp=top-1;tmp>=0;tmp--){
			if(!(stack[tmp].getName().equals("E")))
				return tmp;
		}
		throw new exceptions.MissingOperatorException();
	}
	
	/**
	 * reduce
	 * @throws ExpressionException
	 */
	private void reduce() throws ExpressionException
	{
		Expression tmpexp[]=new Expression[100];
		int i;
		int tmp=0;
		for(i=top-1;i>=0;i--){
			if(stack[i].getName().equals("E")){
				tmpexp[tmp++]=(Expression)stack[i];
			}
		}
		Token token=(Token)stack[getTop()];
		
		
		
		if(token.getType()==TokenType.PLUS){
			if(top>3&&(stack[top-1].getName().equals("E"))&&(!stack[top-2].getName().equals("E"))&&(stack[top-3].getName().equals("E"))){
				if(tmpexp[0].getType()!=TokenType.NUMBER||tmpexp[1].getType()!=TokenType.NUMBER){
					throw new exceptions.TypeMismatchedException();//type smatch
				}
				//System.out.println("plus: "+tmpexp[1].getValue()+tmpexp[0].getValue());
				Expression expr=new Expression("E",tmpexp[1].getValue()+tmpexp[0].getValue(),tmpexp[1].getValue()+tmpexp[0].getValue(),tmpexp[1].getValue()+tmpexp[0].getValue(),TokenType.NUMBER);
				stack[top-3]=expr;
				top-=2;
			}
			else{
				throw new exceptions.MissingOperandException();
			}
		}
		else if(token.getType()==TokenType.MINUS){
			if(top>3&&(stack[top-1].getName().equals("E"))&&(!stack[top-2].getName().equals("E"))&&(stack[top-3].getName().equals("E"))){
				if(tmpexp[0].getType()!=TokenType.NUMBER||tmpexp[1].getType()!=TokenType.NUMBER){
					throw new exceptions.TypeMismatchedException();//type smatch
				}
				//System.out.println("minus: "+(int)(tmpexp[1].getValue()-tmpexp[0].getValue()));
				Expression expr=new Expression("E",tmpexp[1].getValue()-tmpexp[0].getValue(),tmpexp[1].getValue()-tmpexp[0].getValue(),tmpexp[1].getValue()-tmpexp[0].getValue(),TokenType.NUMBER);
				stack[top-3]=expr;
				top-=2;
			}
			else{
				throw new exceptions.MissingOperandException();
			}
		}
		else if(token.getType()==TokenType.MUL){
			if(top>3&&(stack[top-1].getName().equals("E"))&&(!stack[top-2].getName().equals("E"))&&(stack[top-3].getName().equals("E"))){
				if(tmpexp[0].getType()!=TokenType.NUMBER||tmpexp[1].getType()!=TokenType.NUMBER){
					throw new exceptions.TypeMismatchedException();//type smatch
				}
				//System.out.println("mul: "+(int)(tmpexp[1].getValue()*tmpexp[0].getValue()));
				Expression expr=new Expression("E",tmpexp[1].getValue()*tmpexp[0].getValue(),tmpexp[1].getValue()*tmpexp[0].getValue(),tmpexp[1].getValue()*tmpexp[0].getValue(),TokenType.NUMBER);
				stack[top-3]=expr;
				top-=2;
			}
			else{
				throw new exceptions.MissingOperandException();
			}
		}
		else if(token.getType()==TokenType.DIV){
			if(top>3&&(stack[top-1].getName().equals("E"))&&(!stack[top-2].getName().equals("E"))&&(stack[top-3].getName().equals("E"))){
				if(tmpexp[0].getType()!=TokenType.NUMBER||tmpexp[1].getType()!=TokenType.NUMBER){
					throw new exceptions.TypeMismatchedException();//type smatch
				}
				if(tmpexp[0].getValue()==0){
					throw new exceptions.DividedByZeroException();
				}
				//System.out.println("div: "+(int)(tmpexp[1].getValue()/tmpexp[0].getValue()));
				Expression expr=new Expression("E",tmpexp[1].getValue()/tmpexp[0].getValue(),tmpexp[1].getValue()/tmpexp[0].getValue(),tmpexp[1].getValue()/tmpexp[0].getValue(),TokenType.NUMBER);
				stack[top-3]=expr;
				top-=2;
			}
			else{
				throw new exceptions.MissingOperandException();
			}
		}
		else if(token.getType()==TokenType.EXP){
			if(top>3&&(stack[top-1].getName().equals("E"))&&(!stack[top-2].getName().equals("E"))&&(stack[top-3].getName().equals("E"))){
				if(tmpexp[0].getType()!=TokenType.NUMBER||tmpexp[1].getType()!=TokenType.NUMBER){
					throw new exceptions.TypeMismatchedException();//type smatch
				}
				//System.out.println("exp: "+(int)(tmpexp[1].getValue()*tmpexp[0].getValue()));
				double ret=Math.pow(tmpexp[1].getValue(), tmpexp[0].getValue());
				Expression expr=new Expression("E",ret,ret,ret,TokenType.NUMBER);
				stack[top-3]=expr;
				top-=2;
			}
			else{
				throw new exceptions.MissingOperandException();
			}
		}
		else if(token.getType()==TokenType.NEGATIVE){
			if(top>2&&(stack[top-1].getName().equals("E"))&&(!stack[top-2].getName().equals("E"))){
				if(tmpexp[0].getType()!=TokenType.NUMBER){
					throw new exceptions.TypeMismatchedException();//type smatch
				}
				//System.out.println("neg: "+(int)(tmpexp[0].getValue()));
				Expression expr=new Expression("E",-tmpexp[0].getValue(),-tmpexp[0].getValue(),-tmpexp[0].getValue(),TokenType.NUMBER);
				stack[top-2]=expr;
				top-=1;
			}
			else{
				throw new exceptions.MissingOperandException();
			}
		}
		else if(token.getType()==TokenType.NUMBER){
			if(top>1&&!stack[top-1].getName().equals("E")){
				
				Expression expr=new Expression("E",token.getValue(),token.getValue(),token.getValue(),token.getType());
				stack[top-1]=expr;
			}
			else{
				throw new exceptions.MissingOperatorException();
			}
		}
		else if(token.getType()==TokenType.RBRACKET){
			if(top>3&&!stack[top-1].getName().equals("E")&&(stack[top-2].getName().equals("E"))&&(!stack[top-3].getName().equals("E"))
					&&((Token)(stack[top-3])).getType()==TokenType.LBRACKET){
				stack[top-3]=stack[top-2];
				top-=2;
			}
			else{
				if((stack[top-3]).getName().equals("E")){
					throw new exceptions.MissingOperatorException();
				}
				if(!(stack[top-2]).getName().equals("E")&&((Token)(stack[top-2])).getType()==TokenType.LBRACKET){
					throw new exceptions.MissingOperandException();
				}
				if(((Token)(stack[top-3])).getType()!=TokenType.LBRACKET){
					exceptions.MissingLeftParenthesisException e=new exceptions.MissingLeftParenthesisException();
					throw e;
				}
			}
		}
		else if(token.getType()==TokenType.BOOL){
			if(top>1&&!stack[top-1].getName().equals("E")){
				
				Expression expr=new Expression("E",token.getValue(),token.getValue(),token.getValue(),token.getType());
				stack[top-1]=expr;
			}
			else{
				throw new exceptions.MissingOperatorException();
			}	
		}
		else if(token.getType()==TokenType.AND){
			if(top>3&&(stack[top-1].getName().equals("E"))&&(!stack[top-2].getName().equals("E"))&&(stack[top-3].getName().equals("E"))){
				if(tmpexp[0].getType()!=TokenType.BOOL||tmpexp[1].getType()!=TokenType.BOOL){
					throw new exceptions.TypeMismatchedException();//type smatch
				}
				//System.out.println("and: "+(int)(tmpexp[1].getValue()*tmpexp[0].getValue()));
				Expression expr=new Expression("E",tmpexp[1].getValue()*tmpexp[0].getValue(),tmpexp[1].getValue()*tmpexp[0].getValue(),tmpexp[1].getValue()*tmpexp[0].getValue(),TokenType.BOOL);
				stack[top-3]=expr;
				top-=2;
			}
			else{
				throw new exceptions.MissingOperandException();
			}
		}
		else if(token.getType()==TokenType.OR){
			if(top>3&&(stack[top-1].getName().equals("E"))&&(!stack[top-2].getName().equals("E"))&&(stack[top-3].getName().equals("E"))){
				if(tmpexp[0].getType()!=TokenType.BOOL||tmpexp[1].getType()!=TokenType.BOOL){
					throw new exceptions.TypeMismatchedException();//type smatch
				}
				int tmpint=0;
				//System.out.println("or: "+(int)(tmpexp[1].getValue()+tmpexp[0].getValue()));
				if(tmpexp[1].getValue()+tmpexp[0].getValue()>0)
					tmpint=1;
				Expression expr=new Expression("E",tmpint,tmpint,tmpint,TokenType.BOOL);
				stack[top-3]=expr;
				top-=2;
			}
			else{
				throw new exceptions.MissingOperandException();
			}
		}
		else if(token.getType()==TokenType.NOT){
			if(top>2&&(stack[top-1].getName().equals("E"))&&(!stack[top-2].getName().equals("E"))){
				if(tmpexp[0].getType()!=TokenType.BOOL){
					throw new exceptions.TypeMismatchedException();//type smatch
				}
				//System.out.println("not: "+(int)(1-tmpexp[0].getValue()));
				Expression expr=new Expression("E",1-tmpexp[0].getValue(),1-tmpexp[0].getValue(),1-tmpexp[0].getValue(),TokenType.BOOL);
				stack[top-2]=expr;
				top-=1;
			}
			else{
				throw new exceptions.MissingOperandException();
			}
		}
		else if(token.getType()==TokenType.GT){
			if(top>3&&(stack[top-1].getName().equals("E"))&&(!stack[top-2].getName().equals("E"))&&(stack[top-3].getName().equals("E"))){
				if(tmpexp[0].getType()!=TokenType.NUMBER||tmpexp[1].getType()!=TokenType.NUMBER){
					throw new exceptions.TypeMismatchedException();//type smatch
				}
				int ret=0;
				//System.out.println("gt: "+(boolean)(tmpexp[1].getValue()>tmpexp[0].getValue()));
				if(tmpexp[1].getValue()>tmpexp[0].getValue())
					ret=1;
				Expression expr=new Expression("E",ret,ret,ret,TokenType.BOOL);
				stack[top-3]=expr;
				top-=2;
			}
			else{
				throw new exceptions.MissingOperandException();
			}
		}
		else if(token.getType()==TokenType.LT){
			if(top>3&&(stack[top-1].getName().equals("E"))&&(!stack[top-2].getName().equals("E"))&&(stack[top-3].getName().equals("E"))){
				if(tmpexp[0].getType()!=TokenType.NUMBER||tmpexp[1].getType()!=TokenType.NUMBER){
					throw new exceptions.TypeMismatchedException();//type smatch
				}
				int ret=0;
				//System.out.println("lt: "+(boolean)(tmpexp[1].getValue()>tmpexp[0].getValue()));
				if(tmpexp[1].getValue()<tmpexp[0].getValue())
					ret=1;
				Expression expr=new Expression("E",ret,ret,ret,TokenType.BOOL);
				stack[top-3]=expr;
				top-=2;
			}
			else{
				throw new exceptions.MissingOperandException();

⌨️ 快捷键说明

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