0

中置式から後置式への変換を可能にするプログラムを作成しましたが、それは 1 つの数字に対してのみ機能し[A-Z][a-z][0-9]ます。実数 (正と負) を可能にするにはどうすればよいですか?

Example: (50 + 3.75) + 50 --> 50 3.75 + 50 +

infix から postfix への変換を可能にする doTrans()

public String doTrans() {
        for (int j = 0; j < input.length(); j++) {
            char ch = input.charAt(j);
            theStack.displayStack("For " + ch + " ");
            switch (ch) {
            case '+':
            case '-':
                gotOper(ch, 1);
                break;
            case '*':
            case '/':
                gotOper(ch, 2);
                break;
            case '(':
                theStack.push(ch);
                break;
            case ')':
                gotParen(ch);
                break;
            default:
                output = output + ch;
                break;
            }
        }
        while (!theStack.isEmpty()) {
            theStack.displayStack("While ");
            output = output + theStack.pop();
        }
        theStack.displayStack("End ");
        return output;
    }

この行の問題output = output + ch;。1 桁だけではなく整数を取得する方法の解決策が見つかりません

4

1 に答える 1

1

字句解析を行う必要があります。入力ストリームをトークンに変換して分類する必要があります。現時点では、プログラムはすでに実行されていますが、非常に基本的なものであるため、トークンは1桁のみで構成されます。トークンはより複雑になる可能性がありますが、9より大きい単純な整数リテラル、浮動小数点数リテラル、文字列リテラル、単純な演算子などから始まります。

あなたが今持っているかもしれないものは、それを分析して次のトークンにステップするために、次の呼び出しであなたに次のトークンを与えるものです。何かのようなもの:

String input = "1 + 2";
int actPos = 0 ;

....

char getNextToken() {
    return input.charAt(actPos++);
}

あなたがする必要があるgetNextToken()のは、次のステップで分類しなければならない「複雑な」トークン(複数の数字/文字、つまり文字列で構成される)を返すように書き直すことです。

String getNextToken() {
    String StringBuilder token = new StirngBuilde();

    // extract the next token from the input stream
    // using a state automata witch comes to a final
    // state when a token was recognized or an erroneous input

    return token.toString();
}

EIDT

入力ストリームを分析してトークンを生成するには、有限状態マシンを作成する必要があります。

非常に簡単な例を示すために(上記のリンクの定義を読んだと仮定して)、アルファベットが{'0','1','2','3','4','5','6','7','8','9'}あり、符号のない整数であるトークンを作成したいとします。整数を次のように定義します[0-9]+

ステートマシンには、少なくとも3つの状態が必要ですSTART。witchは開始状態、INTEGERwitchは最終状態で受け入れ状態、ERRORwitchは入力にエラーがあることを示します。

ここで、遷移関数と状態遷移表が必要です。これは、実際の入力を受け取り、実際の状態に従って次の状態を生成するものです。

状態遷移表はそのように見える可能性があります(非常に基本的であり、入力がない場合は処理できません)

              i n p u t
              +----------+----------+
              | [0-9]    | else     |
s  +----------+----------+----------+
t  | START    | INTEGER  | ERROR    |
a  +----------+----------+----------+
t  | INTEGER  | INTEGER  | ERROR    |
e  +----------+----------+----------+
   | ERROR    | ERROR    | ERROR    |
   +----------+----------+----------+

したがって、次の入力があるとします。27

  • 開始時に、ステートマシンは状態START(実際の状態)を持っています
  • 最初の文字2を読み取り、それを実際の状態とともに遷移関数に渡します
  • 2は整数であるため、関数は状態に移行します。これは整数INTEGERではないERRORため、トークンをcharごとに作成するバッファに配置します。
  • 次に、次の文字を読み取り、7それを実際の状態とともにINTEGER遷移関数に渡します。
  • 7も整数であり、と同じことが起こり2ます。
  • これで、トークンバッファにコンテンツが含ま27れ、ステートマシンには、INTEGERウィッチが受け入れ状態であり、入力が残っていない状態がまだあります。この時点で、トークンバッファの内容を次のトークンとして返すことができます。

ここで、次の入力があるとします。2e7

ステートマシンは、最初の文字2と状態INTEGERで上記のように進行します。その後、e魔女は上記で定義された整数のルールを満たしていません([0-9]+)。e実際の状態INTEGERを遷移関数に渡すと、状態が遷移しますERROR。この時点で、の位置/インデックスの入力にエラーがあることを通知できますe

私のアドバイスは、字句解析と、それを実現するために有限状態マシンをコーディングする方法についてもっと読むことです。

とはいえ、この分析コードを生成するJLexのようなツールをいつでも使用できますが、それでも、実行したいことを実行するコードを生成するためのルールを定義する必要があります。魔女はあなたを続きを読むように導きます字句解析について:)

幸運を!

于 2013-03-19T20:44:06.460 に答える