Advertisement
HYROLEAN

BonD_FSHybrid-20201009_mod3_to_BonD_FSHybrid-20201009_mod3.1.patch.diff

Oct 22nd, 2020 (edited)
355
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Diff 5.59 KB | None | 0 0
  1. diff -uPr BonD_FSHybrid-20201009_mod3/src/pryutil.cpp BonD_FSHybrid-20201009_mod3.1/src/pryutil.cpp
  2. --- BonD_FSHybrid-20201009_mod3/src/pryutil.cpp 2020-10-21 09:07:52.000000000 +0900
  3. +++ BonD_FSHybrid-20201009_mod3.1/src/pryutil.cpp   2020-10-22 15:12:28.000000000 +0900
  4. @@ -200,25 +200,40 @@
  5.          while(num>0) {p=p->next;num--;}
  6.          return p;
  7.        }
  8. -      int do_calculate(int num,node_t *pos)
  9. +      int __fastcall do_calculate(int &num,node_t *pos)
  10.        {
  11.        #define D1(a)  (p->token==(a))
  12.        #define D2(a,b)  (D1(a)&&p->next->token==(b))
  13.        #define D3(a,b,c) (D2(a,b)&&p->next->next->token==(c))
  14. -        node_t *p,*q;
  15. +        node_t *p;
  16.          int bk_num=0;
  17.          if(pos) while(num>1) {
  18.            if(bk_num==num) {
  19.              // これ以上計算が進まないので、ここで中断する
  20. -            if(pos->token==tVAL)
  21. -              num=1; // VAL が検出できているので、結果おkということにする
  22.              break ;
  23.            }
  24.            bk_num=num;
  25. +          //PRIOR100: ( )  ←先に計算して片付けておく
  26. +          p=pos;
  27. +          for(int i=0;i<num-1;i++,p=p->next) {
  28. +            if(D1(tRP)) break ;
  29. +            if(D1(tLP)) {
  30. +              int n=num-(i+1),m=n;
  31. +              do_calculate(n,p->next);
  32. +              num -= m-n ;
  33. +              if(num-i>=3&&D3(tLP,tVAL,tRP)) {
  34. +                p->val= ( p->next->val );
  35. +                p->token=tVAL;
  36. +                p->next=nest_node(p,3);
  37. +                num-=2;
  38. +              }
  39. +            }
  40. +          }
  41.            //PRIOR20: + - ~ (single)
  42. -          p=pos ; q=NULL;
  43. +          node_t *q=NULL; p=pos ;
  44.            for(int i=0;i<num-1;i++,q=p,p=p->next) {
  45. -            if(q&&(q->token==tVAL||q->token==tRP)) // NG: 左辺値が存在
  46. +            if(D1(tRP)) break ;
  47. +            if(q&&q->token==tVAL) // NG: 左辺値が存在
  48.                continue;
  49.              else if(D2(tADD,tVAL)) {
  50.                p->val= + p->next->val;
  51. @@ -242,6 +257,7 @@
  52.            //PRIOR30: **
  53.            p=pos;
  54.            for(int i=0;i<num-2;) {
  55. +            if(D1(tRP)) break ;
  56.              if(D3(tVAL,tFACT,tVAL)) {
  57.                int val=p->val;
  58.                q=p->next->next;
  59. @@ -261,6 +277,7 @@
  60.            //PRIOR40: * / %
  61.            p=pos;
  62.            for(int i=0;i<num-2;) {
  63. +            if(D1(tRP)) break ;
  64.              if(D3(tVAL,tMUL,tVAL)) {
  65.                p->val=p->val * p->next->next->val;
  66.                p->next=nest_node(p,3);
  67. @@ -281,6 +298,7 @@
  68.            //PRIOR50: + -
  69.            p=pos;
  70.            for(int i=0;i<num-2;) {
  71. +            if(D1(tRP)) break ;
  72.              if(D3(tVAL,tADD,tVAL)) {
  73.                p->val=p->val + p->next->next->val;
  74.                p->next=nest_node(p,3);
  75. @@ -296,6 +314,7 @@
  76.            //PRIOR60: << >>
  77.            p=pos;
  78.            for(int i=0;i<num-2;) {
  79. +            if(D1(tRP)) break ;
  80.              if(D3(tVAL,tLSHIFT,tVAL)) {
  81.                p->val=p->val << p->next->next->val;
  82.                p->next=nest_node(p,3);
  83. @@ -311,6 +330,7 @@
  84.            //PRIOR70: &
  85.            p=pos;
  86.            for(int i=0;i<num-2;) {
  87. +            if(D1(tRP)) break ;
  88.              if(D3(tVAL,tAND,tVAL)) {
  89.                p->val=p->val & p->next->next->val;
  90.                p->next=nest_node(p,3);
  91. @@ -321,6 +341,7 @@
  92.            //PRIOR80: ^
  93.            p=pos;
  94.            for(int i=0;i<num-2;) {
  95. +            if(D1(tRP)) break ;
  96.              if(D3(tVAL,tXOR,tVAL)) {
  97.                p->val=p->val ^ p->next->next->val;
  98.                p->next=nest_node(p,3);
  99. @@ -331,6 +352,7 @@
  100.            //PRIOR90: |
  101.            p=pos;
  102.            for(int i=0;i<num-2;) {
  103. +            if(D1(tRP)) break ;
  104.              if(D3(tVAL,tOR,tVAL)) {
  105.                p->val=p->val | p->next->next->val;
  106.                p->next=nest_node(p,3);
  107. @@ -338,19 +360,9 @@
  108.              }
  109.              else {i++;p=p->next;}
  110.            }
  111. -          //PRIOR100: ( VAL )
  112. -          p=pos;
  113. -          for(int i=0;i<num-2;i++,p=p->next) {
  114. -            if(D3(tLP,tVAL,tRP)) {
  115. -              p->val= ( p->next->val );
  116. -              p->token=tVAL;
  117. -              p->next=nest_node(p,3);
  118. -              num-=2;
  119. -            }
  120. -          }
  121.          }
  122.          //PRIOR10: VAL or not
  123. -        return pos&&pos->token==tVAL&&num==1? pos->val: def_val;
  124. +        return pos&&pos->token==tVAL/*&&num==1*/? pos->val: def_val;
  125.        #undef D1
  126.        #undef D2
  127.        #undef D3
  128. @@ -375,6 +387,7 @@
  129.      s:計算式を書いた文字列。
  130.      計算式と結合法則: (下方程、優先順位が低くなる。)
  131.      ==================
  132. +        ( )                         →
  133.          + - ~ (単項)                ←
  134.          ** (乗算)                   →
  135.          * / %                       →
  136. @@ -383,7 +396,6 @@
  137.          &                           →
  138.          ^                           →
  139.          |                           →
  140. -        ( )                         →
  141.      ==================
  142.      式の意味はC言語で常時使っているものと同様。
  143.      項には、整数のみ使用可能。変数は使用不可。
  144. @@ -391,7 +403,7 @@
  145.      ==================
  146.        0[bB][01]+            ニ進数
  147.        [1-9][0-9]+           十進数
  148. -      [0-7]+                八進数
  149. +      0[0-7]+               八進数
  150.        0[xX][0-9a-fA-F]+     十六進数
  151.      ==================
  152.      セパレーター: スペース/タブ/キャリッジリターン/ニューラインコード
  153.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement