0

私がしているのは、有限のアルファベットの文字列の形で生産規則を作成し、それを char 配列にコピーしてから、文字に応じて関数を呼び出す if ステートメントを実行することです。

functionL、functionF、functionF、functionOpenB、functionF、functionCloseBを呼び出す「lff[f]」など。

したがって、現在は次のとおりです。

workRuleArr= stringProdrule.toCharArray();
for  (char c=0; c < workRuleArr.length; c++){
    if (workRuleArr[c] == 'f')
     {
          functionF();

      }
      if (workRuleArr[c] == 'l')
     {
          functionL();

      }

ただし、これは問題なく機能しています。

"l(100)ff .." などのプロダクション ルールからこれらの関数にパラメータを渡すにはどうすればよいですか?

また、同じプロダクション ルール文字列内に x のさまざまな値が存在する場合があります。ユーザーはプログラムの開始時に一度にルールを入力するため、同じ生産ルールで複数のパラメーターを処理する必要があります。

質問が明確でない場合は、私に知らせてください。ありがとう

4

5 に答える 5

4

あなたが持っているこれらの「ルール関数」はすべて同様の目的を果たしているように思われるので、同じインターフェースに従います。

interface Rule{
    void executeRule();
}

次に、そのインターフェースを実装するさまざまなルールがあります。

class RuleF implements Rule{
        void executeRule(){
            //execute rule F
        }
}

class RuleL implements Rule{
        void executeRule(){
            //execute rule L
        }
}

次に、文字を特定のルールに関連付ける簡単な方法が必要です。次のように HashMap を使用します。

Map<Character, Rule> ruleMap = new HashMap<Character, Rule>();
ruleMap.add('f', new RuleF());
ruleMap.add('l', new RuleL());

これで、これらの「if」をすべて削除できます。

workRuleArr= stringProdrule.toCharArray();
for  (char c=0; c < workRuleArr.length; c++){
    Rule rule = ruleMap.get(workRuleArr[c]);
    rule.executeRule();
}

Rule インターフェイスがパラメーターを受け取る必要がある場合は、渡す必要のあるパラメーターにキャラクターを関連付けるために、同様の Map オブジェクトも必要になります。

一体何を構築しているのですか?ある種のステートマシン?

乾杯、頑張ってください!:-)

于 2012-04-29T20:53:37.113 に答える
1

有効なトークンを提供する何らかのパーサーが必要なようです。または、独自のジェリーリグが必要になるでしょう。いずれにせよ、配列の一歩先を見る必要があります。ここにさらに別の実装があります:

String rule = "FLL(123)FKF";

String pattern = "[a-zA-Z]{1}|[(\\d)]+"; //any single character or set of (numbers)
Pattern p = Pattern.compile(pattern);
Matcher m = p.matcher(rule);

String command = "", param = "", token;

while(m.find()){
  token = m.group();

  if(token.length() > 1){  //must be parameter
    param = token.substring(1, token.length()-1);
    continue;
  }

  if(command != ""){
    runCommand(command, param);
    param = "";  //clear
  }
  command = token;  //set next
}

if(command != "")    //last trailing run
  runCommand(command, param);  

runCommand も定義する必要があります。

bool runCommand(string command, string param){
  System.out.println("execute function" + command + "(" + param + ")");

  bool success, hasParam = (param != "");
  int p = Integer.parseInt(param);

  switch(command){
    case "F":
      success = (hasParam ? functionF() : functionF(p));
      break;
    case "L":
      success = (hasParam ? functionL() : functionL(p));
      break;
    case "K":
      success = (hasParam ? functionK() : functionK(p));
      break;
  }
  return success;
}
于 2012-04-29T23:05:57.720 に答える
1

Command Patternを見てください。あなたは基本的に、この質問に対する答えを求めています

于 2012-04-29T21:09:22.217 に答える
0

簡単な if ステートメントを試して、パラメーターがあるかどうかをテストします。

workRuleArr= stringProdrule.toCharArray();

for  (char c=0; c < workRuleArr.length; c++){

    if (workRuleArr[c] == 'f') {

        if(workRuleArr[c+1].equals("(")) {

            // use the parameter
            String param = "";

            c++;

            while(!workRuleArr[c+1].equals(")")) {
                param += workRuleArr[c+1];
                c++;
            }

            int yourParameter = Integer.parseInt(param);

            functionF(yourParameter);
        }
        else {

            functionF();
        }
    }
    if (workRuleArr[c] == 'l'){

        functionL();
    }
}

コードをテストしていないことに注意してください。エラーが発生する可能性があります。

于 2012-04-29T20:46:50.520 に答える
0

この場合も、 String にはより多くの便利なメソッドがあるため、 char 配列に変換しません。 

したがって、インデックスを持つ各文字について、文字が '('iであるかどうかをテストする必要があります。次に、 を使用して閉じ括弧を取得し、両方の括弧の間の文字列をパラメーターとして関数に渡します。次に、 に進みます。 i+1int k = stringProdrule.indexOf(')', i+2)k+1

于 2012-04-29T20:58:47.437 に答える