演算子順位法での関数の扱い
今手書きでパーサを作ることに挑戦しているのですが
関数の扱いに困っています。
式の文法自体はCに似せようと思っています
関数を発見する事はできました。
しかしその後の引数に扱いに困っています。
1+3+foo(6+2,a+b,5)+(6/5)
ここでfoo等定義されていない物はID,(はLPARENという名前のトークンに分割されています。
ID LPARENという文脈だと(キャストがないので)関数と確定します。
ですがその後
()の中をどうやって扱えばいいのかが分かりません
再帰的に
6+2
a+b
5
に対して式木を作成してそれを追加するという方法も考えたのですが
一番最後に,がなくどうやって判別しようかと迷っていた所です。
どのように考えればいいのでしょうか
アドバイスいただけませんか?
No.2ベストアンサー
- 回答日時:
く, 一通り書いて[確認する]ボタンを押したらトップページに戻されたうえ回答まで完全にロストさせられた... このような挙動をするシステムの作り方の講習があったらぜひにも参加するのだが....
....
ああ, すみません, 演算子順位法の話でしたね. えぇと, #1 で「優先順位を変えるかっこ」について聞いたのは, 実は「ほとんど同じ」だからです. もっというと, 「引数を持つ呼び出し」については実質的に「全く同じ」ということができます.
文法からはおかしな解釈になるのですが, 「引数を区切るコンマ」を「引数リストを作る演算子」と思ってください. すると「全く同じ」であることがなんとなくわかるのではないでしょうか.
もちろん「引数を持たない関数呼び出し」も考えなければならず, そのときにはちょっと違う扱いをしなければなりません (優先順位を変えるかっこでは「空の式」が認められないため). また, 「関数呼び出しのかっこ」は「呼び出される関数」と「(空かもしれない) 引数リスト」からなる「2引数演算子」ですから, 演算子スタックに積むシンボルとしては「優先順位を変えるかっこ」とは別のものにすべきです. まあ, これは「同じ記号で異なる演算子を表す」場合 (単項・2項の - など) には当然ですが.
この回答への補足
#1に補足しようとしたらトップに戻されてイラッとしてました…
ありがとうございます。
成る程そういう解釈があったのですね。
関数は関数fooという名のn項演算子という解釈しかできませんでした。(nは引数のかず)
その方針で実装してみることにします。
ありがとうございました
ほぼその方法で実装できました
スタックには関数の時は関数名を積んで処理しました。
ありがとうございました
No.3
- 回答日時:
まあ解釈はわりと勝手なのでどうでもいいところではありますが, 演算子順位法が LR の一種であることから「LR 的にどうなってくれるとうれしいか」を考えるといいかもしれません.
今の場合, 最初のコンマまでで「1つの引数」としまとまってほしいのですが, これは LR では「1つの式になるまで還元する」ことに対応します. すると, (かっこ以外の) 全ての演算子に対して還元してほしいわけです. これを, 今度は逆に演算子順位法で考えると, コンマを「(ほぼ) 全ての演算子より優先順位の低い演算子」とみれば実現できることになります.
ただ, 実際にはどうするかなぁ.... 「関数呼び出しのかっこ」がきたときに, ε動作で「空の引数リスト」を作るかもしれないなぁ.
成る程
そのような解釈もできるのですね。
ただ今回は#1,2の方の方法を採用させていただいたのでそちらをベストアンサーとさせてください。
ありがとうございました。
No.1
- 回答日時:
演算子順位法でパーズするなら, 「再帰したら負け」のような気がする. 再帰するんだったら, 最初から再帰下降パーザの方が (作るのは) 簡単だと思う. というか, 「演算子順位パーザを手書き」というのがそもそも珍しいような気がする.
さておきちょっと気になるのですが, 現状で「優先順位を変える」かっこは実装できているのでしょうか? 実装できているとしたら, どのように実装しているのでしょうか?
この回答への補足
できています
a+(b+c)とあったら
スタックに
+(+
と左括弧をそのままスタックに積んで
)(右括弧)が来たら最初の(までをはき出すという手順でやっています
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- 物理学 ベクトルと座標系につきまして 1 2022/04/03 06:23
- Excel(エクセル) ExcelのIF関数について 4 2023/05/24 12:54
- 物理学 『数か物か』 4 2022/06/13 06:54
- 数学 参考文献の探し方(数学) 1 2022/07/19 01:09
- Excel(エクセル) Excelで漢字人名が勝手に並び変わる(続) 4 2023/03/21 21:28
- Access(アクセス) アクセス テーブルの空白を変数に置換するボタンが作りたい 4 2022/07/08 11:19
- 数学 高3の微分についての質問です。 ある説明に「数学IIで扱ったのは多項式関数で、この時極限値は必ず存在 6 2023/07/02 10:04
- 物理学 ベクトルを2乗表記 (v↑)^2 について 4 2023/05/24 15:00
- その他(Microsoft Office) 従業員増減対応で当番種類の増減対応な当番表 21 2022/07/19 07:30
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
消えたコロン
-
C言語 exitの使い方
-
VBAでダブルコーテーション入り...
-
jsp~jspにhiddenを使って変数...
-
エラーの意味は? Lvalue req...
-
テキストボックスの値を変数に...
-
EXCEL/VBA 変数の値をクリップ...
-
[VBS]変数を定数に変換する方法...
-
フォームを開くときに、コンボ...
-
DataGridView 複数行同時変更...
-
excelの、ある数式内の{}の意...
-
java final
-
DWORDって
-
processing エラーで、 "cannot...
-
VB.NET 2つの配列を連動して並...
-
Excel-vba 文字列と変数を...
-
VBAの定数の使い方で、計算値を...
-
vbsでテキストファイル内の文字...
-
足して100になるような乱数のア...
-
vbaで極大値を抽出する方法
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
BNFの書き方を教えてください
-
いつもお世話になっております。
-
EXCEL VBA Like演算子 パターン...
-
VBScriptでの正規表現パターン...
-
正規表現で、英数記号を含むパ...
-
BNF(バッカス・ナウア・記法)
-
ビット否定(反転)の記号はど...
-
C言語 exitの使い方
-
エラーの意味は? Lvalue req...
-
VBAでダブルコーテーション入り...
-
フォームを開くときに、コンボ...
-
Excel-vba 文字列と変数を...
-
excelの、ある数式内の{}の意...
-
エクセルへのデータの貼付時に...
-
配列の値を置換するにはどうす...
-
EXCEL/VBA 変数の値をクリップ...
-
だれがとけるの?
-
C言語 列挙型(enum型)変数について
-
VisualStudio2022でC言語プログ...
-
[VBS]変数を定数に変換する方法...
おすすめ情報