Changeset 820
- Timestamp:
- 06/25/07 23:40:18 (17 months ago)
- Files:
-
- 1 modified
-
branches/volker_dev/evaluator.c (modified) (22 diffs)
Legend:
- Unmodified
- Added
- Removed
-
branches/volker_dev/evaluator.c
r805 r820 973 973 RESULT *param[10]; 974 974 975 for (i = 0; i < Root->Children; i++) {976 EvalTree(Root->Child[i]);977 }978 979 975 switch (Root->Token) { 980 976 … … 992 988 /* prepare parameter list */ 993 989 argc = Root->Children; 994 if (argc > 10) 990 if (argc > 10) { 991 error("evaluator: more than 10 children (operands) not supported!"); 995 992 argc = 10; 993 } 996 994 for (i = 0; i < argc; i++) { 995 EvalTree(Root->Child[i]); 997 996 param[i] = Root->Child[i]->Result; 998 997 } … … 1012 1011 case O_LST: /* expression list: result is last expression */ 1013 1012 i = Root->Children - 1; 1013 EvalTree(Root->Child[i]); 1014 1014 type = Root->Child[i]->Result->type; 1015 1015 number = Root->Child[i]->Result->number; … … 1018 1018 1019 1019 case O_SET: /* variable assignment */ 1020 EvalTree(Root->Child[0]); 1020 1021 CopyResult(&Root->Variable->value, Root->Child[0]->Result); 1021 1022 type = Root->Child[0]->Result->type; … … 1025 1026 1026 1027 case O_CND: /* conditional expression */ 1028 EvalTree(Root->Child[0]); 1027 1029 i = 1 + (R2N(Root->Child[0]->Result) == 0.0); 1030 EvalTree(Root->Child[i]); 1028 1031 type = Root->Child[i]->Result->type; 1029 1032 number = Root->Child[i]->Result->number; … … 1033 1036 case O_OR: /* logical OR */ 1034 1037 type = R_NUMBER; 1038 EvalTree(Root->Child[0]); 1039 if (R2N(Root->Child[0]->Result) == 0.0) { 1040 /* calculate 2nd operator only, if 1st operator is false */ 1041 EvalTree(Root->Child[1]); 1042 } 1035 1043 number = ((R2N(Root->Child[0]->Result) != 0.0) || (R2N(Root->Child[1]->Result) != 0.0)); 1036 1044 break; … … 1038 1046 case O_AND: /* logical AND */ 1039 1047 type = R_NUMBER; 1048 EvalTree(Root->Child[0]); 1049 if (R2N(Root->Child[0]->Result) != 0.0) { 1050 /* calculate 2nd operator only, if 1st operator is true */ 1051 EvalTree(Root->Child[1]); 1052 } 1040 1053 number = ((R2N(Root->Child[0]->Result) != 0.0) && (R2N(Root->Child[1]->Result) != 0.0)); 1041 1054 break; … … 1043 1056 case O_EQ: /* numeric equal */ 1044 1057 type = R_NUMBER; 1058 EvalTree(Root->Child[0]); 1059 EvalTree(Root->Child[1]); 1045 1060 number = (R2N(Root->Child[0]->Result) == R2N(Root->Child[1]->Result)); 1046 1061 break; … … 1048 1063 case O_NE: /* numeric not equal */ 1049 1064 type = R_NUMBER; 1065 EvalTree(Root->Child[0]); 1066 EvalTree(Root->Child[1]); 1050 1067 number = (R2N(Root->Child[0]->Result) != R2N(Root->Child[1]->Result)); 1051 1068 break; … … 1053 1070 case O_LT: /* numeric less than */ 1054 1071 type = R_NUMBER; 1072 EvalTree(Root->Child[0]); 1073 EvalTree(Root->Child[1]); 1055 1074 number = (R2N(Root->Child[0]->Result) < R2N(Root->Child[1]->Result)); 1056 1075 break; … … 1058 1077 case O_LE: /* numeric less equal */ 1059 1078 type = R_NUMBER; 1079 EvalTree(Root->Child[0]); 1080 EvalTree(Root->Child[1]); 1060 1081 number = (R2N(Root->Child[0]->Result) <= R2N(Root->Child[1]->Result)); 1061 1082 break; … … 1063 1084 case O_GT: /* numeric greater than */ 1064 1085 type = R_NUMBER; 1086 EvalTree(Root->Child[0]); 1087 EvalTree(Root->Child[1]); 1065 1088 number = (R2N(Root->Child[0]->Result) > R2N(Root->Child[1]->Result)); 1066 1089 break; … … 1068 1091 case O_GE: /* numeric greater equal */ 1069 1092 type = R_NUMBER; 1093 EvalTree(Root->Child[0]); 1094 EvalTree(Root->Child[1]); 1070 1095 number = (R2N(Root->Child[0]->Result) >= R2N(Root->Child[1]->Result)); 1071 1096 break; … … 1073 1098 case O_ADD: /* addition */ 1074 1099 type = R_NUMBER; 1100 EvalTree(Root->Child[0]); 1101 EvalTree(Root->Child[1]); 1075 1102 number = R2N(Root->Child[0]->Result) + R2N(Root->Child[1]->Result); 1076 1103 break; … … 1078 1105 case O_SUB: /* subtraction */ 1079 1106 type = R_NUMBER; 1107 EvalTree(Root->Child[0]); 1108 EvalTree(Root->Child[1]); 1080 1109 number = R2N(Root->Child[0]->Result) - R2N(Root->Child[1]->Result); 1081 1110 break; … … 1083 1112 case O_SGN: /* sign */ 1084 1113 type = R_NUMBER; 1114 EvalTree(Root->Child[0]); 1085 1115 number = -R2N(Root->Child[0]->Result); 1086 1116 break; … … 1088 1118 case O_CAT: /* string concatenation */ 1089 1119 type = R_STRING; 1120 EvalTree(Root->Child[0]); 1121 EvalTree(Root->Child[1]); 1090 1122 s1 = R2S(Root->Child[0]->Result); 1091 1123 s2 = R2S(Root->Child[1]->Result); … … 1098 1130 case O_MUL: /* multiplication */ 1099 1131 type = R_NUMBER; 1132 EvalTree(Root->Child[0]); 1133 EvalTree(Root->Child[1]); 1100 1134 number = R2N(Root->Child[0]->Result) * R2N(Root->Child[1]->Result); 1101 1135 break; … … 1103 1137 case O_DIV: /* division */ 1104 1138 type = R_NUMBER; 1139 EvalTree(Root->Child[0]); 1140 EvalTree(Root->Child[1]); 1105 1141 dummy = R2N(Root->Child[1]->Result); 1106 1142 if (dummy == 0) { … … 1114 1150 case O_MOD: /* modulo */ 1115 1151 type = R_NUMBER; 1152 EvalTree(Root->Child[0]); 1153 EvalTree(Root->Child[1]); 1116 1154 dummy = R2N(Root->Child[1]->Result); 1117 1155 if (dummy == 0) { … … 1125 1163 case O_POW: /* x^y */ 1126 1164 type = R_NUMBER; 1165 EvalTree(Root->Child[0]); 1166 EvalTree(Root->Child[1]); 1127 1167 number = pow(R2N(Root->Child[0]->Result), R2N(Root->Child[1]->Result)); 1128 1168 break; … … 1130 1170 case O_NOT: /* logical NOT */ 1131 1171 type = R_NUMBER; 1172 EvalTree(Root->Child[0]); 1132 1173 number = (R2N(Root->Child[0]->Result) == 0.0); 1133 1174 break;
