問題タブ [shunting-yard]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
objective-c - NSString:componentsSeparatedByCharactersInSet を含む
tokens
戻り値:
[@"4", @"23", @"54", @"543", @"23"]
Objective-C で Shunting Yard を実装しようとしています。トークン化から演算子セット自体を削除せずに、演算子セットを使用して中置文字列をトークン化するにはどうすればよいですか?
必要なもの:
[@"4", @"+", @"23", @"-", @"54", @"/", @"543", @"*", @"23"]
c++ - 文字列を stack.top() に割り当てるときのセグメンテーション違反
私は、(2-4)*7/(3/4) などの複雑な数式を取り込める基本的な計算機に取り組んできました。
避難所アルゴリズムの実装を使用しています...
私はLinux OSを使用しています。gdb デバッガーを使用して、セグメンテーション違反を 1 つの関数に分離しました。coutステートメントを使用して、それをさらに1行に分離しました..しかし、この行がセグメンテーション違反を引き起こしている理由を理解することはできません..すぐに正確な場所について詳しく説明します.最初にいくつかのコードがあります..
std::cout << "10\n";
呼び出し時にセグメンテーション違反が発生していますstd::string topToken = st.top();
いくつかの入力/出力を提供します
入力:(8*2)
出力:1
2
9
2
3
4
8
2
3
4
5
6
8
2
10
11
13
14
2
10
segfault (core dumped)
入力:(4/4)
出力:1
2
9
2
3
4
8
2
3
4
5
6
8
2
10
11
13
14
2
10
segfault (core dump)
ここに簡単に投稿できるいくつかのテストを実行しましたが、正直なところ、それらは非常に冗長になります。もっと見たい場合は、お尋ねください。喜んでもっと提供します。しかし、私はこれらの2つが十分な情報を提供する必要があると感じています...
私はセグメンテーション違反がどこで発生しているかを知っており、その理由についての予感があります..だから、誰かが私に正確に障害が発生している理由を確認できれば、それは素晴らしいことであり、問題の解決策は大歓迎です.
PS: コードのタイプミスはすべてタイプミスです! Linux OSでコーディングしているので、コードを再入力してコピーしましたが、PCを所有しています。そうは言っても...コードはエラーなしでコンパイルされます。スペルミスのある用語はタイプミスです!!
再度、感謝します
編集: 数日後にこれに戻った後、コードに対してさらにいくつかのテストを実行しました。今回は括弧なしの式を使用します。
入力:3-9
出力:1
2
3
8
2
3
4
5
7
8
17
19
20
segfault (core dump)
入力:6/8
出力:
1
2
3
8
2
3
4
5
7
8
17
19
20
そのため、呼び出し時にセグメンテーション違反も発生していますstrArray.assign( out.begin(), out.end() );
javascript - 不要な括弧を使用したヤード アルゴリズムのシャント
入力 (JavaScript) は "3-2+(8-3)" です
この表現を逆ポーランド記法に翻訳したいと思います。ただし、アルゴリズムによると、結果12に評価されない「3 2 8 3 - + -」を取得できます.....これに対する回避策はありますか? ここでは括弧が不要であることはわかっていますが、まあ...私は以下の関数を持っています:
java - 操車場アルゴリズムに変数識別を実装する
これは、この質問のフォローアップです。この時点で、プログラムが自分で変数を識別し、次のように表示するのではなく、ユーザーに変数値 .so を要求するようにします。
プログラムは次のように機能する必要があります。
そのため、ユーザーは変数が何であるかをマシンに伝える必要がなくなりました。どうすればこれを達成できますか?
この質問を確認しましたが、必要なものとはかなり異なり、Pythonにもあります
更新:具体的には、変数を見つけることができるように、分流場アルゴリズムを反復したいと考えています。http://paste.ubuntu.com/9999494/の下にパーサー コードのリンクを配置しました。
function - 関数のデバッグを伴う入換場アルゴリズム
演算子の横に分流場アルゴリズムに「関数」を実装し、結果のアルゴリズムから小さなインタープリターを作成したいのですが、トークンの構文上の誤った使用法はデフォルトのアルゴリズムでは無視されます。
私を助けたいと思っている(またはそうでない)通訳者を書いた人はいますか?これは、この問題で立ち往生している多くの人々を助けるでしょう!
以下にいくつかのテストを示します。shunting-yard 関数は、関数呼び出しでのトークンの間違った使用法および/または演算子/オペランドの欠落を無視します。
私が読んだいくつかの研究:
いくつかの改善を加えてこれをテストするための私のコード (vbscript) の説明:
改善点や良いアイデアを共有したい人がいたら、私に知らせてください!
私のコード:
[編集] インタプリタの構文を BASIC プログラミング言語とほぼ同じにしたい。
BASIC like 式の例: a + b * (c / func(x, y, func(z))) - d
構文上の間違った表現の例: 1 + 2 + + 3 3 func(,1,(,2)) ()
私の目標: 分流ヤードアルゴリズムの出力は正しい順序である必要があり、構文に問題が発生した場合はエラーが発生するはずです:空の括弧「()」または複数の演算子/関数/整数の連続または間違った括弧関数呼び出しでは許可されていません...
これまでのところ、式を正しい方法で入力すれば、関数、整数、および演算子は正しい順序になっています。
それが vbscript 自体で機能する場合は、このアルゴリズムで機能するはずです。そうでない場合は、このスクリプト エーテルで機能しないはずであり、エラーが発生します...それが私がここでやろうとしていることです..
構文をどのようにしたいか:(「[]」の間はオプションを意味し、「;」はコメント、「##」の間はそのタイトルの説明へのリンクです...)
c++ - C++ 数式パーサーの問題
何らかの理由で、コードを正しく動作させることができません。常に Thread 1: EXC_BAD_ACCESS (code=EXC_1386_GPFLT) エラーをスローします。(3+4) のような単純な文字列を使用してテストすると、「+」記号も正しく配置されません。Queue は 34+ のようになりますが、3+4 を保持します。「+」演算子がスタックにプッシュされることはないように思えます。私が注意を向けるべきものを見つけるのを手伝ってくれる人はいますか?
algorithm - 中置式を逆ポーランド記法に変換しながらメソッドの引数の数を数える方法
以下のような表現があります。MIN(MAX(AVG(AVG(4,2),2,3),SUM(1,2))) 分置場アルゴリズムを実装して、中置記号を逆ポーランド語表記に変換しました。関数 MAX 、 MIN 、および AVG を 2 つの引数で追加します。しかし、可変引数を実装したい場合、各関数が中置式にいくつの引数を持っているかを知る必要があるとします。誰かが私に教えてもらえますか?infixをrpnに変換する際の各関数の引数の?
java - JavaでのShunting-Yard Algorithmの実装により、誤った出力と文字列インデックスが範囲外になりますか?
Shunting-Yard アルゴリズムを実装し、結果を評価しています。これは、ノード (オペレーター用とオペランド用) とスタック (オペレーター用とオペランド用) を使用した参照ベースの実装です。
入力ファイルには以下が含まれます (最初の数行のみ):
出力:
主要:
operandStack (operatorStack にも 1 つ。同じで、int の代わりに char を使用するだけです):
ノード (オペランド/整数用にも 1 つ):
アルゴリズムは次のとおりです。
「;」を含むように演算子スタックを初期化します (スタック演算子の下部)
最初のトークンを取得する
式の終わりに達していない間
トークンがオペランドの場合
トークンを印刷する
オペランドをオペランド スタックにプッシュする
トークンが ')' の場合
演算子スタックの一番上が「(」と等しくない間</p>
オペレータ スタックをポップする
演算子を印刷する
オペランド スタックを 2 回ポップする
指定された操作を 2 つのオペランドに適用する
演算結果をオペランド スタックにプッシュする
終了する
「(」をポップして破棄する
そうしないと
while inputPriority(token) ≤ stackPriority(オペレータースタックのトップ)
オペレータ スタックをポップする
演算子を印刷する
オペランド スタックを 2 回ポップする
指定された操作を 2 つのオペランドに適用する
演算結果をオペランド スタックにプッシュする
終了する
トークンをオペレーター スタックにプッシュする
次のトークンを取得する
終了する
演算子スタックの一番上は「;」と等しくありません</p>
オペレータ スタックをポップする
演算子を印刷する
オペランド スタックを 2 回ポップする
指定された操作を 2 つのオペランドに適用する
演算結果をオペランド スタックにプッシュする
終了する
オペランド スタックをポップし、結果を出力します
どんな助けでも大歓迎です。