import java.util.StringTokenizer;
import javax.swing.JOptionPane;
/*
* Created on Jul 22, 2005
*
* TODO To change the template for this generated file go to
* Window - Preferences - Java - Code Style - Code Templates
*/
/**
* @author sunan.ye
*
* TODO To change the template for this generated type comment go to Window -
* Preferences - Java - Code Style - Code Templates
*/
public class expression {
private String[] variable = new String[100000];
private String[] constant = new String[100000];
private int m = 0;
private int n = 0;
public void input() {
String expressions = JOptionPane.showInputDialog(null,
"Please input expressions:");
expressions.trim();
StringTokenizer st = new StringTokenizer(expressions, ";");
while (st.hasMoreTokens()) {
String expression = st.nextToken();
int k;
for(int i =0;i<expression.length();i++){
if(expression.charAt(i) == '='){
k = i;
break;
}
}
if(k == 0){
System.out.println("Variable excepted");
break;
}
if(k == expression.length() - 1){
System.out.println("Constant excepted");
break;
}
StringTokenizer st1 = new StringTokenizer(expression, "=");
while (st1.hasMoreTokens()) {
//保存表达式左边
String left = st1.nextToken();
//保存表达式右边
String right = st1.nextToken();
int p = checkVariable(left);
int q = checkConstant(right);
//变量不合理
if(p == -2)
break;
//常量不合理
if(q == -2)
break;
//变量合理
//如果变量是新定义的
if (p == -1) {
//判断常量是否是数字
if (q == -1){
//将新变量保存
variable[m++] = left;
//将常量保存
constant[n++] = right;
}
if(q == 1){
//将新变量保存
variable[m++] = left;
//将常量保存
constant[n++] = constant[checkVariable(right)];
}
//变量已存在
} else if (q == -1)//常量是数字直接保存
constant[p] = right;
else//右边为已定义变量
constant[p] = constant[checkVariable(right)];
}
}
/*
for (int i = 0; i < m; i++)
System.out.println(variable[i] + constant[i]);
*/
}
public void checkexpression(){
}
//检查表达式左边,判断变量是否是新定义的,以及是否合理
public int checkVariable(String left) {
/*
if(left == null){
System.out.println("Variable excepted");
return -2;
}
*/
//变量的第一个字符只能为a..z或者_
int first = (int)left.charAt(0);
if(!((first >= 65 && first <= 90)
|| (first >= 97 && first <=122)
|| first==95)){
System.out.println("Variable " + left + " error");
System.out.println("Variable can not include '" +
(char)first + "'");
return -2;//表示该变量不合理
}
//变量的其他字符只能为a..z,0..9,或者_
for(int i = 1;i < left.length();i++){
first = (int)left.charAt(i);
//判断变量的定义是否合理
if(
!((first >= 65 && first <= 90)
|| (first >= 97 && first <=122)
|| first==95
|| (first >=48 && first <= 57))
){
System.out.println("Variable " + left + " error");
System.out.println("Variable can not include '" +
(char)first + "'");
return -2;//表示该变量不合理
}
}
for (int i = 0; i < m; i++)
if (left.equals(variable[i]))
return i;//返回已存在变量的位置
return -1;//表示该变量为新变量
}
//检查表达式右边,判断常量是否是合理
public int checkConstant(String right) {
/*
if(right == null){
System.out.println("Constant excepted");
return -2;
}
*/
try {
Integer.parseInt(right);
} catch (NumberFormatException e) {
int i;
for (i = 0; i < m; i++)
if (right.equals(variable[i]))
break;//返回已存在变量的位置
if (i < m) {//右边是已定义变量
// constant[l] = constant[p];
return 1;
} else{
System.out.println("Number " + right + " format error");
return -2;
}
}
return -1;//常量是数字
}
public void output() {
String[] con = new String[100000];
int k = 0;
for (int i = 0; i < n; i++){
int j = 0;
for(j = 0; j < k;j++){
if (constant[i].equals(con[j]))
break;
}
if(j==k)
con[k++] = constant[i];
}
for (int i = 0; i < k; i++){
System.out.print("[");
for (int j = 0; j < m; j++) {
if(constant[j].equals(con[i]))
System.out.print(variable[j]+",");
}
System.out.println("]=" + con[i]);
}
}
public static void main(String[] args) {
expression exp = new expression();
exp.input();
exp.output();
}
}