exited normally

--back of the flyer--

MyHL 複合代入演算子を追加

MyHLは、haribote HL-8cを改造したバージョンです。

複合代入演算子を追加

@@ -139,6 +139,7 @@ int tc[10000]; // トークンコード列を格納する
 enum {
   PlusPlus,
   MinusMinus,
+  Ex,
   Equal,
   NotEq,
   Les,
@@ -158,7 +159,16 @@ enum {
   AndAnd,
   OrOr,
   Assign,
-  Ex,
+  PlusAssign,
+  MinusAssign,
+  MultiAssign,
+  DiviAssign,
+  ModAssign,
+  AndAssign,
+  XorAssign,
+  OrAssign,
+  ShlAssign,
+  ShrAssign,

   Lparen,
   Rparen,
@@ -214,6 +224,7 @@ enum {
 String defaultTokens[] = {
   "++",
   "--",
+  "!",
   "==",
   "!=",
   "<",
@@ -233,7 +244,16 @@ String defaultTokens[] = {
   "&&",
   "||",
   "=",
-  "!",
+  "+=",
+  "-=",
+  "*=",
+  "/=",
+  "%=",
+  "&=",
+  "^=",
+  "|=",
+  "<<=",
+  ">>=",

   "(",
   ")",
@@ -315,6 +335,16 @@ typedef enum {
   Infix_AndAnd = 12,
   Infix_OrOr = 13,
   Infix_Assign = 15,
+  Infix_PlusAssign = 15,
+  Infix_MinusAssign = 15,
+  Infix_MultiAssign = 15,
+  Infix_DiviAssign = 15,
+  Infix_ModAssign = 15,
+  Infix_AndAssign = 15,
+  Infix_XorAssign = 15,
+  Infix_OrAssign = 15,
+  Infix_ShlAssign = 15,
+  Infix_ShrAssign = 15,
   LowestPrecedence = 99,
   NoPrecedence = 100
 } Precedence;
@@ -322,6 +352,7 @@ typedef enum {
 Precedence precedenceTable[][2] = {
   [PlusPlus]   = {NoPrecedence,     Prefix_PlusPlus},
   [MinusMinus] = {NoPrecedence,     Prefix_MinusMinus},
+  [Ex]         = {NoPrecedence,     Prefix_Ex},
   [Equal]      = {Infix_Equal,      NoPrecedence},
   [NotEq]      = {Infix_NotEq,      NoPrecedence},
   [LesEq]      = {Infix_LesEq,      NoPrecedence},
@@ -341,7 +372,16 @@ Precedence precedenceTable[][2] = {
   [ShiftLeft]  = {Infix_ShiftLeft,  NoPrecedence},
   [ShiftRight] = {Infix_ShiftRight, NoPrecedence},
   [Assign]     = {Infix_Assign,     NoPrecedence},
-  [Ex]         = {NoPrecedence,     Prefix_Ex},
+  [PlusAssign]  = {Infix_PlusAssign,  NoPrecedence},
+  [MinusAssign] = {Infix_MinusAssign, NoPrecedence},
+  [MultiAssign] = {Infix_MultiAssign, NoPrecedence},
+  [DiviAssign]  = {Infix_DiviAssign,  NoPrecedence},
+  [ModAssign]   = {Infix_ModAssign,   NoPrecedence},
+  [AndAssign]   = {Infix_AndAssign,   NoPrecedence},
+  [XorAssign]   = {Infix_XorAssign,   NoPrecedence},
+  [OrAssign]    = {Infix_OrAssign,    NoPrecedence},
+  [ShlAssign]   = {Infix_ShlAssign,   NoPrecedence},
+  [ShrAssign]   = {Infix_ShrAssign,   NoPrecedence},
 };

 enum { Infix, Prefix, EndOfStyles };
@@ -618,6 +658,12 @@ int evalExpression(Precedence precedence)
         e0 = evalExpression(encountered);
         putIc(OpCpy, &vars[res], &vars[e0], 0, 0);
       }
+      else if (PlusAssign <= tc[epc] && tc[epc] <= ShrAssign) {
+        int oper = tc[epc];
+        ++epc;
+        e0 = evalExpression(encountered);
+        putIc(OpAdd + oper - PlusAssign, &vars[res], &vars[res], &vars[e0], 0);
+      }
       else {
         res = evalInfixExpression(res, encountered - 1, tc[epc]);
       }