0

宿題用に、Excel に似た C++ コンソール アプリを作成しています。私のアプリは、セルの数式を受け入れることができる必要があります。たとえば、次のように評価する必要があります。

Sum(tablename\fieldname[recordnumber], fieldname[recordnumber], ...)

tablename\fieldname[recordnumber] points to a cell in another table, 
fieldname[recordnumber] points to a cell in current table

また

Sin(fieldname[recordnumber])

また

anotherfieldname[recordnumber]

また

"10" // (simply a number)

そんな感じ。関数は、Sum、Ave、Sin、Cos、Tan、Cot、Mul、Div、Pow、Log (10)、Ln、Mod です。

それは哀れです、私は知っていますが、それは私の宿題です:'(

では、このようなものを評価するためのトリックを知っている人はいますか?

4

5 に答える 5

2

解析については、再帰降下解析を検討します。次に、すべての可能な関数名を関数ポインターにマップするテーブルを作成します。

struct FunctionTableEntry {
    string name;
    double (*f)(double);
};
于 2009-01-25T12:15:24.403 に答える
2

さて、いい宿題の質問です。

それは本当にあなたがこれをどれだけ重くしたいかによって異なります. 完全な式パーサーを作成できます (これは楽しいですが、時間もかかります)。

そのためには、完全な文法を記述し、フロントエンドを記述する必要があります (lex と yacc または flexx と bison.

しかし、あなたの質問を見ると、次の 3 つのサブケースに限定できます。

  • 単純な値
  • ルックアップ (おそらく他のテーブルへ)
  • 入力がルックアップである関数

ここでは、OO の設計が少し役立つと思います。

リアルタイムの更新と循環依存関係のチェックに対処する必要があるかどうかはわかりません。そうでなければ、それらもトリッキーになる可能性があります。

于 2009-01-25T11:10:43.863 に答える
1

以前のレスポンダーは頭を悩ませていました。セルの内容を解析して解釈する必要があります

StackOverflow には、リソースへのポインターを見つけることができるコンパイラーとインターパーターの構築に関する多数の質問が既にあります。それらのいくつかは次のとおりです。

等々。

余談ですが、私にはそれらすべてを結び付けたり、包括的なリストを作ろうとする気力がありません。

于 2009-01-25T15:40:10.940 に答える
1

パーサーを作成する必要があります。パーサーは式、つまり各行を取得し、コマンドを識別して解析ツリーを構築する必要があります。これが第一段階です。2 番目のフェーズでは、コマンドの各要素をデータで置き換えることにより、ツリーを評価できます。

于 2009-01-25T11:10:49.683 に答える
0

yacc/lex (など) を使用できないと思われるため、「手動で」解析する必要があります
。文字列を繰り返し処理し、その部分に分割します。どの部分が何なのかは、あなたの文法 (構文) に依存します。そうすれば、関数名とパラメーターを見つけることができます。これの難しさは、構文の複雑さによって異なります。

字句解析について少し読んだほうがいいかもしれません。

于 2009-01-25T11:08:25.100 に答える