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]); }