📄 parser.java
字号:
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 + -