// 関数の構文検査と評価 // // 2002/ 5/ 6 宍戸 輝光 import java.awt.*; import java.awt.event.*; import java.util.*; public class kansuu extends java.applet.Applet implements ActionListener { TextField tfStr,tfValue; Button btEqual; Panel pnCtr; public void init() { tfStr=new TextField(12); tfValue=new TextField(12); 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); } public void actionPerformed(ActionEvent e) { String str; if (e.getSource()==btEqual) { // =ボタンクリックイベント // 入力内容を評価し、結果を表示 tfValue.setText(String.valueOf(parse(tfStr.getText()))); } } private int parse(String stArg) { // 渡された文字列を数値・関数として評価 String stFunc,stNum; int len=stArg.length(),n=0,index=0,num; boolean bErr=false; if (len==0) return -1; if (isNum(stArg)) // 数値なら、その値を返す return parseNum(stArg); // ()を検査 for (int i=0;i2 && i==len-1) n=-1; else bErr=true; } if (n>0) // 既に(が出てきていたらn++ n++; } // ()の検査結果が異常ならエラー if (n!=-1) bErr=true; if (bErr) return -1; // (の前の関数名候補と()内の引数候補の文字列を取得 stFunc=stArg.substring(0,index); stNum=stArg.substring(index+1,len-1); // 引数が数値でなければエラー if (!isNum(stNum)) return -1; num=parseNum(stNum); if (stFunc.equals("inc")) return ++num; if (stFunc.equals("sqr")) return num*num; // 関数名が異常ならエラー return -1; } private boolean isNum(String stArg) { // 文字列が数値か検査 if (stArg.length()==0) return false; for (int i=0;i