📄 新建 文本文档.txt
字号:
package parser;
import exceptions.*;
import scanner.*;
import java.io.*;
public class Parser {
Scanner scanner;
ParserTable parserTable;
Symbol stack[];
Token lookahead;
Expression fin;
int top;
public Parser()
{
parserTable=new ParserTable();
}
public void accept()
{
fin=(Expression)(stack[1]);
}
public void error()
{
System.out.println("error");
}
int getTop() throws Exception
{
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();
}
public void reduce() throws Exception
{
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
}
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(((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();
}
}
else if(token.getType()==TokenType.GE){
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -