Parse1.java
Allikas: Lambda
import java.io.*;
class pdata {
int ival;
ExpNode expval;
int strpt;
boolean success=true;
/*
pdata () {
success=true;
}
*/
}
abstract class ExpNode {
abstract double value(); // Return the value of this node.
} // end class ExpNode
class VarNode extends ExpNode { // Represents a node that holds a number
String var;
VarNode( String str ) { // Constructor. Create a node to hold val.
var = str;
}
double value() { // The value is just the number that the node holds.
return 10;
}
} // end class ConstNode
class ConstNode extends ExpNode { // Represents a node that holds a number
double number; // The number in the node.
ConstNode( double val ) { // Constructor. Create a node to hold val.
number = val;
}
double value() { // The value is just the number that the node holds.
return number;
}
} // end class ConstNode
class BinOpNode extends ExpNode { // Represents a node that holds an operator.
char op; // The operator.
ExpNode left; // The left operand.
ExpNode right; // The right operand.
BinOpNode( char op, ExpNode left, ExpNode right ) { // Constructor.
this.op = op;
this.left = left;
this.right = right;
}
double value() {
double leftVal = left.value();
double rightVal = right.value();
switch ( op ) {
case '+': return leftVal + rightVal;
case '-': return leftVal - rightVal;
case '*': return leftVal * rightVal;
case '/': return leftVal / rightVal;
default: return Double.NaN; // Bad operator.
}
}
} // end class BinOpNode
public class parse1 {
public static void main(String[] args) {
pdata res;
System.out.println("Parse: "+args[0]);
res=parseexp(args[0],0);
System.out.println("res ival: "+res.ival);
System.out.println("res expval: "+
res.expval.value());
}
static pdata parseexp(String str, int pt) {
int i1;
int i2;
ExpNode exp;
char s;
pdata el1;
pdata el2;
pdata res;
int len;
len=str.length();
if (Character.isDigit(str.charAt(pt))) {
return parseint(str,pt);
}
if (str.charAt(pt)!='(') {
return parsevar(str,pt);
}
pt++;
el1=parseexp(str,pt);
if ((el1.strpt)>=len) {
return parseerr("cannot find operator");
}
s=str.charAt(el1.strpt);
if ((el1.strpt+1)>=len) {
return parseerr("cannot find second arg");
}
el2=parseexp(str,el1.strpt+1);
if (str.charAt(el2.strpt)!=')') {
return parseerr("cannot find )");
}
/*
System.out.println(
"el1 ival: "+
el1.ival+
" el1 strpt: "+
el1.strpt+
"s: "+s+
"el2 ival: "+
el2.ival+
" el2 strpt: "+
el2.strpt);
*/
res=new pdata();
res.strpt=el2.strpt+1;
/*
if (s=='+') res.ival=el1.ival+el2.ival;
else if (s=='*') res.ival=el1.ival*el2.ival;
else if (s=='-') res.ival=el1.ival-el2.ival;
else if (s=='/') res.ival=el1.ival/el2.ival;
else return parseerr("unknown operator");
*/
exp = new BinOpNode(s,el1.expval,el2.expval);
res.expval=exp;
return res;
}
static pdata parseint(String str, int pt) {
int ires=0;
int i;
ExpNode exp;
int len;
String tmp;
pdata res;
len=str.length();
for(i=pt; i<len; i++) {
if (!Character.isDigit(str.charAt(i))) {
break;
}
}
//System.out.println("str: "+str);
//System.out.println("i: "+i);
tmp=str.substring(pt,i);
//System.out.println(" tmp: "+tmp);
ires = Integer.parseInt(tmp);
res=new pdata();
//res.ival=ires;
exp= new ConstNode(ires);
res.expval=exp;
res.strpt=i;
return res;
}
static pdata parsevar(String str, int pt) {
pdata res;
ExpNode exp;
res = new pdata();
exp= new VarNode(str.substring(pt,pt+1));
res.expval=exp;
res.strpt=pt+1;
return res;
}
static pdata parseerr(String errstr) {
pdata res;
res = new pdata();
res.success=false;
System.out.println("ERROR : "+errstr);
return res;
}
}