3つ以上のパラメーターを使用して最小/最大を計算する

エルフス

宿題として、+操作しかできない基本的な計算機があり、より多くの関数を実装する必要があります。角かっこ演算子、符号演算子、および最小最大関数を実装する必要がありました。最後のタスクの1つは、min / max関数を拡張して、3つ以上のパラメーターを使用してmin / maxを計算することです。これが、現在行き詰まっているタスクです。

私の現在のcalc.llexファイル:

%{
extern int yylval;
extern int sym[];
extern int yyerror(char *s);
#include "y.tab.h"
%}

%%

[a-z]   {
           yylval = *yytext - 'a';
           return VARIABLE;
        }

[0-9]+  {
           yylval = atoi(yytext);
           return INTEGER;
        }

[(),]   { return *yytext; }

":="    return ASSIGN;
"+"     return PLUS;
"-"     return MINUS;
"/"     return DIVIDE;
"%"     return MODULO;
"*"     return TIMES;
"<"     return SMAS;
"<="    return SMGAS;
"=="    return IS;
"!="    return NOTIS;
">="    return BGGAS;
">"     return BGAS;

"min"   return MIN;
"max"   return MAX;

"\n"    return NEWLINE;

[ \t]   ;

.       yyerror("Invalid character");

%%

int yywrap() {
 return 1;
}

私の現在のcalc.yyaccファイル:

%{
#include <stdio.h>
int sym[26];
int yylex();
int yyerror(char *s);
%}

%token VARIABLE ASSIGN INTEGER NEWLINE
%left PLUS
%left TIMES
%left MINUS
%left DIVIDE
%left MODULO
%left UMINUS
%left UPLUS
%left SMAS SMGAS IS NOTIS BGAS BGGAS
%left MIN MAX

%%

program: program statement
       |
       ;

statement: expr NEWLINE
             { printf("%d\n", $1); }
         | VARIABLE ASSIGN expr NEWLINE
             { sym[$1] = $3; }
         ;

expr: INTEGER            { $$ = $1; }
      | VARIABLE         { $$ = sym[$1]; }
      | expr PLUS expr   { $$ = $1 + $3; }
      | expr TIMES expr  { $$ = $1 * $3; }
      | expr MINUS expr  { $$ = $1 - $3; }
      | expr DIVIDE expr { $$ = $1 / $3; }
      | expr MODULO expr { $$ = $1 % $3; }
      | '(' expr ')'     { $$ = $2;      }

      | MINUS expr %prec UMINUS { $$ = -$2; }
      | PLUS expr %prec UPLUS { $$ = $2; }

      | expr SMAS  expr   { $$ = $1 < $3;  }
      | expr SMGAS expr   { $$ = $1 <= $3; }
      | expr IS    expr   { $$ = $1 == $3; }
      | expr NOTIS expr   { $$ = $1 != $3; }
      | expr BGGAS expr   { $$ = $1 >= $3; }
      | expr BGAS  expr   { $$ = $1 > $3;  }

      | MIN '(' expr ',' expr ')' { if ($3 < $5){ $$ = $3; } else if ($3 > $5){ $$ = $5; }; }
      | MAX '(' expr ',' expr ')' { if ($3 > $5){ $$ = $3; } else if ($3 < $5){ $$ = $5; }; }

      ;

%%

int yyerror(char *s) {
  fprintf(stderr, "%s\n", s);
  return 0;
}

int main() {
  yyparse();
  return 0;
}

解決策の1つは、min / max関数で各値を、で区切り、計算してからmin / max関数に返すことだと思いますが、実装方法がわかりません。私が考えることができる唯一の解決策はかなり複雑です。プロジェクトはそれほど複雑であってはならないので、私はそれを行う簡単な方法が欠けていると思います。

min(5、6)は必要に応じて5を返し、期待される動作方法は(min 6、7、3)で3を返し、無限の数のパラメーターに使用できます。

アイデアはありますか?

ありがとう!

Yavor Ivanov

あなたが必要max(x,y)max(x,y,z,q..)

考えられる解決策の1つは、(... x、z ...)を繰り返すことができるため、そのためのルールはほとんど必要ありません。var、これは必要な操作を決定するために使用されます。

expr ',' expr { if(var==1){$$=$1>$3?$1:$3;}else{$$=$1<$3?$1:$3;}; }
'(' expr ')' { $$ = $2;}
MAX  expr    { $$ = $2;}
MAX  expr    { $$ = $2;}

あなたの*.lファイルには外部変数が必要です(それを呼びましょうvarextern int var

また、可約式のためのルールを追加maxし、min1または0に私達の変数を設定するであろう:

min { op =0;}
max { op =1;}

ここで、1はMAX、MINは0です。

操作を行う前.lvar最初に設定したいので、これはファイルで行われます

.yファイルで行うとvar、操作後に設定されます。

変数*.yもファイルに追加します(int var =0)

.yファイルあなたMAXMINでなければなりません%tokensさらに、1位/ 2位に追加,%rightます(COMMA代わりに使用できます,)。そうでなければ、もしあなたが持っている..4,5*5,..なら、最初に比較し、次にそれを掛けます。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

テーブル値を動的に計算し、SQLServerのパラメーターから最小および最大ターゲットを見つける方法

分類Dev

2 つのパラメーターを持つ range を使用して n の階乗を計算します

分類Dev

可変引数(3つ以上のパラメーター)を取ることができる最大または最小マクロを実装できますか?

分類Dev

ymd_hmsデータを使用して1時間ごとの最小/最大を計算する

分類Dev

Rを使用して3つ以上のパラメーターを必要とするGeminiExchange RESTAPIプライベートエンドポイント

分類Dev

BatchNormaliztionを使用してCNNモデルのパラメーター数を計算する方法

分類Dev

BatchNormaliztionを使用してCNNモデルのパラメーター数を計算する方法

分類Dev

javascriptの計算値を使用して変換をパラメーター化する方法は?

分類Dev

計算された式をSSRSのパラメーターとして使用する方法はありますか?

分類Dev

1つのパラメーターに制約を課してscipy最小化を使用する

分類Dev

2つのパラメーターを受け取る関数を使用して、各パラメーターの2乗の合計を返します

分類Dev

3つ以上のデータポイント間の方位を計算します

分類Dev

3つのパラメーターを使用してsqlalchemyでフィルターを使用する方法

分類Dev

変更パラメータを使用して積分を計算し、すべての結果をシーケンスとしてRに記録する方法は?

分類Dev

PROCGLMを使用してパラメーター推定値の線形結合を「自動的に」計算します

分類Dev

類似性のパーセンテージを計算するか、3つ以上のオブジェクト間の相関を計算します

分類Dev

MatlabのOpencvのカメラキャリブレーションパラメーターを使用して画像ポイントを再計算する

分類Dev

2つのデータフレームを使用して最終的な価値のパンダを計算する

分類Dev

golangでjulienschmidt / httprouterを使用して2つ以上のパラメータを渡す方法は?

分類Dev

DartのAngular2のパラメーターを使用して2つ以上のルーティングレベルをネストする方法

分類Dev

SQLServerでパラメーター以上の関数を作成して実行する

分類Dev

事前に計算された値をemberjsのurlパラメーターとして使用できますか?

分類Dev

パラメータを指定して式関数の結果を計算する最速の方法

分類Dev

AlexNetのパラメータ数を計算する方法は?

分類Dev

Rのmpmからパラメータを計算する方法

分類Dev

GridSearchCV(python)を使用して、パラメーターを使用して関数を最大化または最小化する方法は?

分類Dev

メジャーまたはパラメータを渡して計算テーブルを作成する

分類Dev

dplyrを使用してグループ化するときに、平均、最小、および最大を計算する方法は?

分類Dev

データフレーム列の最小、最大、平均を計算します

Related 関連記事

  1. 1

    テーブル値を動的に計算し、SQLServerのパラメーターから最小および最大ターゲットを見つける方法

  2. 2

    2 つのパラメーターを持つ range を使用して n の階乗を計算します

  3. 3

    可変引数(3つ以上のパラメーター)を取ることができる最大または最小マクロを実装できますか?

  4. 4

    ymd_hmsデータを使用して1時間ごとの最小/最大を計算する

  5. 5

    Rを使用して3つ以上のパラメーターを必要とするGeminiExchange RESTAPIプライベートエンドポイント

  6. 6

    BatchNormaliztionを使用してCNNモデルのパラメーター数を計算する方法

  7. 7

    BatchNormaliztionを使用してCNNモデルのパラメーター数を計算する方法

  8. 8

    javascriptの計算値を使用して変換をパラメーター化する方法は?

  9. 9

    計算された式をSSRSのパラメーターとして使用する方法はありますか?

  10. 10

    1つのパラメーターに制約を課してscipy最小化を使用する

  11. 11

    2つのパラメーターを受け取る関数を使用して、各パラメーターの2乗の合計を返します

  12. 12

    3つ以上のデータポイント間の方位を計算します

  13. 13

    3つのパラメーターを使用してsqlalchemyでフィルターを使用する方法

  14. 14

    変更パラメータを使用して積分を計算し、すべての結果をシーケンスとしてRに記録する方法は?

  15. 15

    PROCGLMを使用してパラメーター推定値の線形結合を「自動的に」計算します

  16. 16

    類似性のパーセンテージを計算するか、3つ以上のオブジェクト間の相関を計算します

  17. 17

    MatlabのOpencvのカメラキャリブレーションパラメーターを使用して画像ポイントを再計算する

  18. 18

    2つのデータフレームを使用して最終的な価値のパンダを計算する

  19. 19

    golangでjulienschmidt / httprouterを使用して2つ以上のパラメータを渡す方法は?

  20. 20

    DartのAngular2のパラメーターを使用して2つ以上のルーティングレベルをネストする方法

  21. 21

    SQLServerでパラメーター以上の関数を作成して実行する

  22. 22

    事前に計算された値をemberjsのurlパラメーターとして使用できますか?

  23. 23

    パラメータを指定して式関数の結果を計算する最速の方法

  24. 24

    AlexNetのパラメータ数を計算する方法は?

  25. 25

    Rのmpmからパラメータを計算する方法

  26. 26

    GridSearchCV(python)を使用して、パラメーターを使用して関数を最大化または最小化する方法は?

  27. 27

    メジャーまたはパラメータを渡して計算テーブルを作成する

  28. 28

    dplyrを使用してグループ化するときに、平均、最小、および最大を計算する方法は?

  29. 29

    データフレーム列の最小、最大、平均を計算します

ホットタグ

アーカイブ