// http://www.unf.edu/~rzucker/cot3100dir/parser.java
// http://www.unf.edu/~rzucker/cot3100dir/parser.html
//
import java.awt.*;
public class parser extends java.applet.Applet
{
Font myfont=new Font("Helvetica",Font.PLAIN,16);
TextField infix, postfix, prefix;
String inhold, prehold, posthold;
void buildConstraints(GridBagConstraints gbc, int gx, int gy,
int gw, int gh, int wx, int wy)
{
gbc.gridx=gx;
gbc.gridy=gy;
gbc.gridheight=gh;
gbc.gridwidth=gw;
gbc.weightx=wx;
gbc.weighty=wy;
gbc.ipadx=5;
gbc.ipady=5;
}
public void init()
{
setFont(myfont);
// set up applet layout
GridBagLayout gridbag= new GridBagLayout();
GridBagConstraints constraints = new GridBagConstraints();
setLayout(gridbag);
buildConstraints(constraints,0,0,1,1,10,20);
Label lab1=new Label("Infix notation:",Label.RIGHT);
constraints.fill = GridBagConstraints.BOTH;
constraints.anchor=GridBagConstraints.CENTER;
gridbag.setConstraints(lab1, constraints);
add(lab1);
infix = new TextField("");
buildConstraints(constraints,1,0,1,1,90,0);
gridbag.setConstraints(infix, constraints);
add(infix);
Label lab2=new Label("Postfix notation:",Label.RIGHT);
buildConstraints(constraints,0,1,1,1,0,20);
gridbag.setConstraints(lab2, constraints);
add(lab2);
postfix = new TextField("");
buildConstraints(constraints,1,1,1,1,0,0);
gridbag.setConstraints(postfix, constraints);
add(postfix);
Label lab3=new Label("Prefix notation:",Label.RIGHT);
buildConstraints(constraints,0,2,1,1,0,20);
gridbag.setConstraints(lab3, constraints);
add(lab3);
prefix = new TextField("");
buildConstraints(constraints,1,2,1,1,0,0);
gridbag.setConstraints(prefix, constraints);
add(prefix);
inhold="";
posthold="";
prehold="";
}
public boolean action(Event e, Object arg)
{
if (e.target instanceof TextField)
return handleText();
else
return false;
}
boolean handleText()
{
String inFix, postFix, preFix;
if (!inhold.equals(infix.getText()))
{
inFix = infix.getText();
inhold=inFix;
parsePost(inFix);
parsePre(inFix);
}
else
if (!posthold.equals(postfix.getText()))
{
postFix = postfix.getText();
posthold=postFix;
inFix = postParse(postFix);
parsePre(inFix);
}
else
if (!prehold.equals(prefix.getText()))
{
preFix = prefix.getText();
prehold=preFix;
inFix=preParse(preFix);
parsePost(inFix);
}
return true;
}
void parsePost(String inval)
{
String opString, outString;
char ltr;
int i;
opString="";
outString="";
for (i=0; i < inval.length(); i++)
{
ltr = inval.charAt(i);
switch (ltr)
{
case '(':
opString+='(';
break;
case ')':
while ((opString.length() > 0) &&
(opString.charAt(opString.length()-1)!= '('))
{
outString+=opString.charAt(opString.length()-1);
opString=opString.substring(0,opString.length()-1);
}
opString=opString.substring(0,opString.length()-1);
break;
case '^':
while ((opString.length() > 0) &&
(opString.charAt(opString.length()-1)== '^'))
{
outString+=opString.charAt(opString.length()-1);
opString=opString.substring(0,opString.length()-1);
}
opString+=ltr;
break;
case '*': case '/':
while ((opString.length() > 0) &&
( (opString.charAt(opString.length()-1)== '^')
|| (opString.charAt(opString.length()-1)== '*')
|| (opString.charAt(opString.length()-1)== '/')))
{
outString+=opString.charAt(opString.length()-1);
opString=opString.substring(0,opString.length()-1);
}
opString+=ltr;
break;
case '+': case '-':
while ((opString.length() > 0) &&
(( opString.charAt(opString.length()-1)== '^')
|| (opString.charAt(opString.length()-1)== '*')
|| (opString.charAt(opString.length()-1)== '/')
|| (opString.charAt(opString.length()-1)== '+')
|| (opString.charAt(opString.length()-1)== '-')))
{
outString+=opString.charAt(opString.length()-1);
opString=opString.substring(0,opString.length()-1);
}
opString+=ltr;
break;
default:
outString+=ltr;
break;
}
}
while (opString.length() > 0)
{
outString+=opString.charAt(opString.length()-1);
opString=opString.substring(0,opString.length()-1);
}
postfix.setText(outString);
posthold=outString;
}
void parsePre(String inval)
{
String opString, outString;
char ltr;
int i;
opString="";
outString="";
for (i=inval.length()-1; i >= 0; i--)
{
ltr = inval.charAt(i);
switch (ltr)
{
case ')':
opString+=')';
break;
case '(':
while ((opString.length() > 0) &&
(opString.charAt(opString.length()-1)!= ')'))
{
outString=opString.charAt(opString.length()-1)+outString;
opString=opString.substring(0,opString.length()-1);
}
opString=opString.substring(0,opString.length()-1);
break;
case '^':
while ((opString.length() > 0) &&
(opString.charAt(opString.length()-1)== '^'))
{
outString=opString.charAt(opString.length()-1)+outString;
opString=opString.substring(0,opString.length()-1);
}
opString+=ltr;
break;
case '*': case '/':
while ((opString.length() > 0) &&
( (opString.charAt(opString.length()-1)== '^')))
{
outString=opString.charAt(opString.length()-1)+outString;
opString=opString.substring(0,opString.length()-1);
}
opString+=ltr;
break;
case '+': case '-':
while ((opString.length() > 0) &&
(( opString.charAt(opString.length()-1)== '^')
|| (opString.charAt(opString.length()-1)== '*')
|| (opString.charAt(opString.length()-1)== '/')))
{
outString=opString.charAt(opString.length()-1)+outString;
opString=opString.substring(0,opString.length()-1);
}
opString+=ltr;
break;
default:
outString=ltr+outString;
}
}
while (opString.length() > 0)
{
outString=opString.charAt(opString.length()-1)+outString;;
opString=opString.substring(0,opString.length()-1);
}
prefix.setText(outString);
prehold=outString;
}
String postParse(String inval)
{
String[] operands = new String[30];
String newop;
int i, opcount,numval,opsub;
opcount=-1;
for (i=0; i=0; i--)
{
char ltr = inval.charAt(i);
if (!((ltr=='^') || (ltr=='*') || (ltr=='/') || (ltr=='+') || (ltr=='-')))
{
opcount++;
operands[opcount]="" + ltr;
}
else
{
numval=0;
newop="(";
opsub=opcount;
while (numval<2)
{
if (!operands[opsub].equals(""))
{
numval++;
if (numval==1)
newop=newop + operands[opsub] + ltr;
else
newop=newop + operands[opsub] + ")";
operands[opsub]="";
}
opsub--;
}
operands[opcount]=newop;
}
}
infix.setText(operands[opcount]);
inhold=operands[opcount];
return inhold;
}
}