質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Yarn

Yarnは、Facebook/Exponent/Google/Tildeが開発したJavaScriptのパッケージマネージャ。npmよりもインストールが速く、厳密にモジュールのバージョンを固定できるなど、npmの問題を解決。npmと互換性があり、同じpackage.jsonを使用できます。

Q&A

2回答

1753閲覧

yaccの四則演算優先順位について

cgen

総合スコア17

Yarn

Yarnは、Facebook/Exponent/Google/Tildeが開発したJavaScriptのパッケージマネージャ。npmよりもインストールが速く、厳密にモジュールのバージョンを固定できるなど、npmの問題を解決。npmと互換性があり、同じpackage.jsonを使用できます。

0グッド

0クリップ

投稿2021/06/30 07:42

前提・実現したいこと

yaccで四則演算の定義を行ったのですが、掛け算が足し算、引き算よりも優先的に実行されるようにするにはどうすればいいでしょうか。

該当のソースコード

yacc

1%token NUM; 2%% 3explist : 4| explist expr '\n' { printf("%d\n", $2); } 5; 6expr : prim { $$ = $1; } 7| expr '+' prim { $$ = $1 + $3; } 8| expr '-' prim { $$ = $1 + $3; } 9| expr '*' prim { $$ = $1 * $3; } 10; 11prim : NUM { $$ = atoi(yytext); } 12|'(' expr ')' { $$ = $2; } 13; 14

試したこと

% ./a.out
(1 + 2) * (3 + 1)
12
1 + 2 * 3 + 1
10
このように前から順に計算されます。通常の四則演算のように掛け算が先に行われるにはどうしたらよいでしょうか

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

2通りの解を示しますので、試してみた結果をコメントしてください。

yacc

1%token NUM 2%left '+' '-' // 左結合 3%left '*' // 上記より高優先順位 4%% 5explist : 6| explist expr '\n' { printf("%d\n", $2); } 7; 8expr : prim { $$ = $1; } 9| expr '+' expr { $$ = $1 + $3; } // 優先順位指定済みなので expr でよい 10| expr '-' expr { $$ = $1 - $3; } 11| expr '*' expr { $$ = $1 * $3; } 12; 13prim : NUM { $$ = atoi(yytext); } 14|'(' expr ')' { $$ = $2; } 15;

または

yacc

1%token NUM 2%% 3explist : 4| explist expr '\n' { printf("%d\n", $2); } 5; 6expr : term { $$ = $1; } 7| expr '+' term { $$ = $1 + $3; } 8| expr '-' term { $$ = $1 - $3; } 9; 10term: prim { $$ = $1; } 11| term '*' prim { $$ = $1 * $3; } 12; 13prim : NUM { $$ = atoi(yytext); } 14|'(' expr ')' { $$ = $2; } 15; 16```1G

投稿2021/09/25 11:30

kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

構文規則を分けて、掛け算が先にreduceされるようにする必要がありますね。
似たようなことしてるページがあるので、以下が参考になるかなと
http://kmaebashi.com/programmer/devlang/yacclex.html

投稿2021/06/30 08:46

編集2021/06/30 08:47
S.Percentage

総合スコア283

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問