// 関数の引数の再帰的評価 // // 2002/ 5/11 宍戸 輝光 import java.awt.*; import java.awt.event.*; public class kansuu2 extends java.applet.Applet implements ActionListener { TextField tfStr,tfValue; TextArea taView; Button btEqual; int iCall; Panel pnCtr,pnView; public void init() { tfStr=new TextField(20); tfValue=new TextField(8); btEqual=new Button(" = "); btEqual.addActionListener(this); pnCtr=new Panel(); pnCtr.add(new Label("String")); pnCtr.add(tfStr); pnCtr.add(btEqual); pnCtr.add(tfValue); add(pnCtr); pnView=new Panel(); taView=new TextArea(10,60); pnView.add(taView); add(pnView); } public void actionPerformed(ActionEvent e) { String str; if (e.getSource()==btEqual) { // =ボタンクリックイベント taView.setText(""); iCall=0; // 入力内容を評価し、結果を表示 tfValue.setText(parse(tfStr.getText())); } } private String parse(String stArg) { if (taView.getText().length()>0) taView.append("\n"); taView.append(String.valueOf(++iCall)+" - arg:"+stArg); if (isNum(stArg)) { // 数値なら、その値を返す taView.append(" return:"+String.valueOf(parseNum(stArg))); return String.valueOf(parseNum(stArg)); } if (!isFunc(stArg)) { // 数値でも関数でもなければエラー taView.append(" return:Error"); return "Error"; } String stStr=getArg(stArg); // 関数の引数取得 if (stStr.length()==0) { taView.append(" return:Error"); return "Error"; } if (isFunc(stStr)) { // 関数の引数が関数なら、再帰呼び出し taView.append(" return:parse("+getFunc(stArg)+"(parse("+stStr+"))"); return parse(getFunc(stArg)+"("+parse(stStr)+")"); } if (isNum(stStr)) { // 関数の引数が数値なら、評価 String stFunc=getFunc(stArg); int arg=parseNum(stStr); if (stFunc.equals("inc")) { taView.append(" return:"+String.valueOf(arg+1)); return String.valueOf(arg+1); } if (stFunc.equals("sqr")) { taView.append(" return:"+String.valueOf(arg*arg)); return String.valueOf(arg*arg); } } taView.append(" return:Error"); return "Error"; } private boolean isNum(String stArg) { // 文字列が数値か検査 if (stArg.length()==0) return false; for (int i=0;i