/*
* $Id: Expression.java,v 1.1 2001/06/03 00:19:12 ChoK Exp $
*
* Copyright 2001 Kenta Cho. All rights reserved.
*/
package jp.gr.java_conf.abagames.bulletml_demo;
import java.util.Random;
/**
* Turn expression into RPN.
*
* @version $Revision: 1.1 $
*/
public class Expression
{
private static Random rnd = new Random();
private static final int MAX_LENGTH = 128;
public static final int STACK_VARIABLE = 11;
public static final int STACK_RANK = -2;
public static final int STACK_RAND = -1;
public static final int STACK_NUM = 0;
public static final int PLUS = 1;
public static final int MINUS = 2;
public static final int MULTIPLE = 3;
public static final int DIVISION = 4;
public static final int MODULO = 5;
private float[] num = new float[MAX_LENGTH];
private int[] opr = new int[MAX_LENGTH];
private int idx;
private float[] stack = new float[MAX_LENGTH];
public Expression()
{
idx = 0;
}
private float calcOp(int op, float n1, float n2)
{
switch (op)
{
case PLUS:
return n1 + n2;
case MINUS:
return n1 - n2;
case MULTIPLE:
return n1 * n2;
case DIVISION:
return n1 / n2;
case MODULO:
return n1 % n2;
}
return 0;
}
public void setOperator(int op)
{
if (idx >= MAX_LENGTH)
{
return;
}
if ((opr[idx - 1] == STACK_NUM) && (opr[idx - 2] == STACK_NUM))
{
num[idx - 2] = calcOp(op, num[idx - 2], num[idx - 1]);
idx--;
}
else
{
opr[idx] = op;
idx++;
}
}
public void push(float nm, int vr)
{
if (idx >= MAX_LENGTH)
{
return;
}
num[idx] = nm;
opr[idx] = vr;
idx++;
}
public float calc(float[] prms)
{
int stkIdx = 0;
for (int i = 0; i < idx; i++)
{
switch (opr[i])
{
case STACK_NUM:
stack[stkIdx] = num[i];
stkIdx++;
break;
case STACK_RAND:
stack[stkIdx] = rnd.nextFloat();
stkIdx++;
break;
case STACK_RANK:
stack[stkIdx] = BulletmlUtil.getRank();
stkIdx++;
break;
default:
if (opr[i] >= STACK_VARIABLE)
{
stack[stkIdx] = prms[opr[i] - STACK_VARIABLE];
stkIdx++;
}
else
{
stack[stkIdx - 2] = calcOp(opr[i], stack[stkIdx - 2], stack[stkIdx - 1]);
stkIdx--;
}
break;
}
}
return stack[0];
}
}