Compiler.c 33 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195
  1. #include <setjmp.h>
  2. #include <stdarg.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. #include "Compiler.h"
  7. #include "DataType.h"
  8. #include "tokenizer/Tokenizer.h"
  9. #include "utils/Functions.h"
  10. #include "utils/Variables.h"
  11. #include "vm/Operation.h"
  12. #define ERROR_LENGTH 256
  13. #define RETURN_BUFFER 16
  14. #define BREAK_BUFFER 32
  15. #define DT_OPERATION(op) \
  16. case DT_INT: cAddOperation(OP_##op##_INT); break; \
  17. case DT_BOOL: cAddOperation(OP_##op##_BOOL); break; \
  18. case DT_FLOAT: cAddOperation(OP_##op##_FLOAT); break;
  19. static jmp_buf errorJump;
  20. static char error[ERROR_LENGTH] = {'\0'};
  21. static ByteCode* code;
  22. static int16 line = 1;
  23. static bool onLine = false;
  24. static Variables vars;
  25. static Functions functions;
  26. static Functions functionQueue;
  27. static Structs structs;
  28. static int returns[RETURN_BUFFER];
  29. static int returnIndex = 0;
  30. static int hasReturn = 0;
  31. static DataType returnType;
  32. static int breaks[BREAK_BUFFER];
  33. static int breakIndex = 0;
  34. static int forWhileStack = 0;
  35. static int continueAt = 0;
  36. typedef struct {
  37. Operation intOp;
  38. Operation floatOp;
  39. Operation boolOp;
  40. Operation pointerOp;
  41. const char* name;
  42. } TypedOp;
  43. static const TypedOp TYPED_MUL = {OP_MUL_INT, OP_MUL_FLOAT, OP_NOTHING,
  44. OP_NOTHING, "*"};
  45. static const TypedOp TYPED_DIV = {OP_DIV_INT, OP_DIV_FLOAT, OP_NOTHING,
  46. OP_NOTHING, "/"};
  47. static const TypedOp TYPED_MOD = {OP_MOD_INT, OP_NOTHING, OP_NOTHING,
  48. OP_NOTHING, "%"};
  49. static const TypedOp TYPED_ADD = {OP_ADD_INT, OP_ADD_FLOAT, OP_NOTHING,
  50. OP_NOTHING, "+"};
  51. static const TypedOp TYPED_SUB = {OP_SUB_INT, OP_SUB_FLOAT, OP_NOTHING,
  52. OP_NOTHING, "-"};
  53. static const TypedOp TYPED_LESS = {OP_LESS_INT, OP_LESS_FLOAT, OP_NOTHING,
  54. OP_NOTHING, "<"};
  55. static const TypedOp TYPED_LESS_EQUAL = {OP_GREATER_INT, OP_GREATER_FLOAT,
  56. OP_NOTHING, OP_NOTHING, "<="};
  57. static const TypedOp TYPED_GREATER = {OP_GREATER_INT, OP_GREATER_FLOAT,
  58. OP_NOTHING, OP_NOTHING, ">"};
  59. static const TypedOp TYPED_GREATER_EQUAL = {OP_LESS_INT, OP_LESS_FLOAT,
  60. OP_NOTHING, OP_NOTHING, ">="};
  61. static const TypedOp TYPED_EQUAL = {OP_EQUAL_INT, OP_EQUAL_FLOAT, OP_EQUAL_BOOL,
  62. OP_EQUAL_POINTER, "=="};
  63. static const TypedOp TYPED_NOT_EQUAL = {OP_EQUAL_INT, OP_EQUAL_FLOAT,
  64. OP_EQUAL_BOOL, OP_EQUAL_POINTER, "!="};
  65. static const TypedOp TYPED_BIT_OR = {OP_BIT_OR, OP_NOTHING, OP_NOTHING,
  66. OP_NOTHING, "|"};
  67. static const TypedOp TYPED_BIT_XOR = {OP_BIT_XOR, OP_NOTHING, OP_NOTHING,
  68. OP_NOTHING, "^"};
  69. static const TypedOp TYPED_BIT_AND = {OP_BIT_AND, OP_NOTHING, OP_NOTHING,
  70. OP_NOTHING, "&"};
  71. static const TypedOp TYPED_LEFT_SHIFT = {OP_LEFT_SHIFT, OP_NOTHING, OP_NOTHING,
  72. OP_NOTHING, "<<"};
  73. static const TypedOp TYPED_RIGHT_SHIFT = {OP_RIGHT_SHIFT, OP_NOTHING,
  74. OP_NOTHING, OP_NOTHING, ">>"};
  75. static void cError(const char* format, ...) {
  76. va_list args;
  77. va_start(args, format);
  78. vsnprintf(error, ERROR_LENGTH, format, args);
  79. va_end(args);
  80. longjmp(errorJump, 0);
  81. }
  82. static const char* cGetName(DataType dt) {
  83. return dtGetName(&structs, dt);
  84. }
  85. static void cInvalidOperation(DataType a, DataType b, const char* op) {
  86. cError("invalid operation: %s %s %s", cGetName(a), op, cGetName(b));
  87. }
  88. static void cNotDeclared(const char* name) {
  89. cError("variable %s has not been declared", name);
  90. }
  91. static void cDeclared(const char* name) {
  92. cError("%s has already been declared", name);
  93. }
  94. static void cTooMuchArguments() {
  95. cError("too much function arguments");
  96. }
  97. static void cUnexpectedToken(Token t) {
  98. cError("unexpected token on line %d: %s", line, tGetName(t));
  99. }
  100. static void cAddOperation(Operation token) {
  101. unsigned char c = token;
  102. bcAddBytes(code, &c, 1);
  103. }
  104. static int cReserveInt() {
  105. return bcReserveBytes(code, sizeof(int));
  106. }
  107. static void cSetInt(int p, int i) {
  108. bcSetBytes(code, p, &i, sizeof(int));
  109. }
  110. static void cAddInt(int i) {
  111. bcAddBytes(code, &i, sizeof(int));
  112. }
  113. static void cAddIntOperation(Operation token, int i) {
  114. cAddOperation(token);
  115. cAddInt(i);
  116. }
  117. static void cAddByteOperation(Operation token, char c) {
  118. cAddOperation(token);
  119. bcAddBytes(code, &c, sizeof(char));
  120. }
  121. static void cAddInt16(int16 i) {
  122. bcAddBytes(code, &i, sizeof(int16));
  123. }
  124. static Token cReadTokenAndLine() {
  125. hasReturn--;
  126. Token t = tReadToken();
  127. if(tReadInt16(&line)) {
  128. return t;
  129. }
  130. return T_END;
  131. }
  132. static void cConsumeToken(Token wanted) {
  133. Token t = cReadTokenAndLine();
  134. if(wanted != t) {
  135. cError("unexpected token on line %d: expected '%s' got '%s'", line,
  136. tGetName(wanted), tGetName(t));
  137. }
  138. }
  139. static bool cConsumeTokenIf(Token t) {
  140. if(tPeekToken() == t) {
  141. cReadTokenAndLine();
  142. return true;
  143. }
  144. return false;
  145. }
  146. static void cConstantInt() {
  147. int value;
  148. if(!tReadInt(&value)) {
  149. cError("int token without an int on line %d", line);
  150. }
  151. cAddIntOperation(OP_PUSH_INT, value);
  152. }
  153. static void cConstantFloat() {
  154. float value;
  155. if(!tReadFloat(&value)) {
  156. cError("float token without a float on line %d", line);
  157. }
  158. cAddOperation(OP_PUSH_FLOAT);
  159. bcAddBytes(code, &value, sizeof(float));
  160. }
  161. static const char* cReadString() {
  162. int length;
  163. const char* literal = tReadString(&length);
  164. if(literal == NULL) {
  165. cError("literal without string on line %d", line);
  166. }
  167. return literal;
  168. }
  169. static DataType cReadStruct() {
  170. const char* name = cReadString();
  171. Struct* st = stsSearch(&structs, name);
  172. if(st == NULL) {
  173. cError("struct %s does not exist");
  174. }
  175. return dtStruct(st);
  176. }
  177. static DataType cExpression();
  178. static void cLoadRef(DataType type) {
  179. if(dtIsPointer(type)) {
  180. cAddOperation(OP_REFERENCE);
  181. return;
  182. }
  183. switch(type.type) {
  184. DT_OPERATION(LOAD);
  185. case DT_STRUCT:
  186. {
  187. Struct* st = dtGetStruct(&structs, type);
  188. if(st == NULL) {
  189. cError("compiler struct error");
  190. }
  191. cAddIntOperation(OP_LOAD, dtGetSize(type, &structs));
  192. break;
  193. }
  194. default: cError("cannot load type %s", cGetName(type));
  195. }
  196. }
  197. static DataType cUnpack(DataType dt) {
  198. if(dtRemoveVariable(&dt)) {
  199. cLoadRef(dt);
  200. }
  201. return dt;
  202. }
  203. static DataType cUnpackedExpression() {
  204. return cUnpack(cExpression());
  205. }
  206. static void cCallFunctionArguments(Function* f) {
  207. while(!cConsumeTokenIf(T_CLOSE_BRACKET)) {
  208. DataType dt = cUnpackedExpression();
  209. if(fAddArgument(f, dt, &structs)) {
  210. cTooMuchArguments();
  211. }
  212. if(cConsumeTokenIf(T_COMMA) && tPeekToken() == T_CLOSE_BRACKET) {
  213. cUnexpectedToken(tPeekToken());
  214. }
  215. }
  216. }
  217. static DataType cCallFunction(const char* name) {
  218. cAddIntOperation(OP_PUSH_INT, 0);
  219. Function f;
  220. fInit(&f, name, line);
  221. cCallFunctionArguments(&f);
  222. cAddOperation(OP_GOSUB);
  223. Function* found = fsSearch(&functions, &f);
  224. if(found == NULL) {
  225. cError("unknown function");
  226. }
  227. if(found->address == -1) {
  228. f.returnType = found->returnType;
  229. f.address = cReserveInt();
  230. fsAdd(&functionQueue, &f);
  231. } else {
  232. cAddInt(found->address);
  233. }
  234. cAddInt(found->size);
  235. return found->returnType;
  236. }
  237. static void cStore(DataType left, DataType right, const char* name) {
  238. if(!dtCompare(left, right)) {
  239. cInvalidOperation(left, right, name);
  240. }
  241. if(dtIsPointer(left)) {
  242. cAddOperation(OP_STORE_POINTER);
  243. return;
  244. }
  245. switch(left.type) {
  246. DT_OPERATION(STORE);
  247. default: cError("cannot store type %s", cGetName(left));
  248. }
  249. }
  250. static DataType cLiteral() {
  251. const char* literal = cReadString();
  252. if(cConsumeTokenIf(T_OPEN_BRACKET)) {
  253. return cCallFunction(literal);
  254. }
  255. Variable v;
  256. if(vsSearch(&vars, &v, literal)) {
  257. cNotDeclared(literal);
  258. }
  259. cAddIntOperation(OP_DEREFERENCE_VAR, v.address);
  260. return dtToVariable(v.type);
  261. }
  262. static DataType cBracketPrimary() {
  263. DataType result = cExpression();
  264. cConsumeToken(T_CLOSE_BRACKET);
  265. return result;
  266. }
  267. static DataType cExtendType(DataType dt) {
  268. while(cConsumeTokenIf(T_MUL)) {
  269. dt = dtDereference(dt);
  270. }
  271. return dt;
  272. }
  273. static DataType cReadType() {
  274. DataType dt = dtVoid();
  275. Token t = cReadTokenAndLine();
  276. switch(t) {
  277. case T_INT: dt = dtInt(); break;
  278. case T_BOOL: dt = dtBool(); break;
  279. case T_FLOAT: dt = dtFloat(); break;
  280. case T_LITERAL: dt = cReadStruct(); break;
  281. default: cUnexpectedToken(t);
  282. }
  283. return cExtendType(dt);
  284. }
  285. static DataType cAllocArray() {
  286. DataType dt = cReadType();
  287. cConsumeToken(T_OPEN_SQUARE_BRACKET);
  288. DataType index = cUnpackedExpression();
  289. if(!dtCompare(index, dtInt())) {
  290. cError("array size must be an int");
  291. }
  292. cConsumeToken(T_CLOSE_SQUARE_BRACKET);
  293. cAddIntOperation(OP_NEW, dtGetSize(dt, &structs));
  294. return dtDereference(dt);
  295. }
  296. static DataType cLength() {
  297. DataType pointer = cUnpackedExpression();
  298. if(!dtIsPointer(pointer)) {
  299. cError("length expects a pointer");
  300. }
  301. cAddOperation(OP_LENGTH);
  302. return dtInt();
  303. }
  304. static DataType cPrimary() {
  305. Token t = cReadTokenAndLine();
  306. switch(t) {
  307. case T_CONST_INT: cConstantInt(); return dtInt();
  308. case T_CONST_FLOAT: cConstantFloat(); return dtFloat();
  309. case T_TRUE: cAddOperation(OP_PUSH_TRUE); return dtBool();
  310. case T_FALSE: cAddOperation(OP_PUSH_FALSE); return dtBool();
  311. case T_OPEN_BRACKET: return cBracketPrimary();
  312. case T_LITERAL: return cLiteral();
  313. case T_NEW: return cAllocArray();
  314. case T_LENGTH: return cLength();
  315. default: cUnexpectedToken(t); return dtVoid();
  316. }
  317. }
  318. static void cPostChange(DataType* dt, int change, const char* name) {
  319. if(!dtRemoveVariable(dt) || !dtCompare(*dt, dtInt())) {
  320. cError("%s needs an int reference", name);
  321. } else if(onLine) {
  322. cAddByteOperation(OP_INT_CHANGE, change);
  323. *dt = dtVoid();
  324. } else {
  325. cAddByteOperation(OP_PUSH_POST_INT_CHANGE, change);
  326. }
  327. }
  328. static DataType cStructAccess(DataType dt, int pointers) {
  329. Struct* st = dtGetStruct(&structs, dt);
  330. if(st == NULL || dt.pointers != pointers) {
  331. cError(pointers == 0 ? ". expects a struct" : "-> expects a struct*");
  332. }
  333. cConsumeToken(T_LITERAL);
  334. const char* name = cReadString();
  335. Variable inner;
  336. if(vSearchStruct(&inner, &structs, st, name)) {
  337. cError("%s has no member %s", st->name, name);
  338. }
  339. if(inner.address > 0) {
  340. cAddIntOperation(OP_PUSH_INT, inner.address);
  341. cAddOperation(OP_ADD_REFERENCE);
  342. }
  343. return dtToVariable(inner.type);
  344. }
  345. static DataType cAccess() {
  346. DataType dt = cPrimary();
  347. while(true) {
  348. if(cConsumeTokenIf(T_INCREMENT)) {
  349. cPostChange(&dt, 1, "++");
  350. } else if(cConsumeTokenIf(T_DECREMENT)) {
  351. cPostChange(&dt, -1, "--");
  352. } else if(cConsumeTokenIf(T_POINT)) {
  353. if(!dtRemoveVariable(&dt)) {
  354. cError(". expects a reference");
  355. }
  356. dt = cStructAccess(dt, 0);
  357. } else if(cConsumeTokenIf(T_ARROW)) {
  358. dt = cStructAccess(cUnpack(dt), 1);
  359. } else if(cConsumeTokenIf(T_OPEN_SQUARE_BRACKET)) {
  360. dt = cUnpack(dt);
  361. if(!dtIsPointer(dt)) {
  362. cError("[] needs a pointer");
  363. }
  364. DataType index = cUnpackedExpression();
  365. if(!dtCompare(index, dtInt())) {
  366. cError("array index must be an int");
  367. }
  368. cConsumeToken(T_CLOSE_SQUARE_BRACKET);
  369. cAddOperation(OP_ADD_REFERENCE);
  370. dt = dtToVariable(dtReference(dt));
  371. } else {
  372. break;
  373. }
  374. }
  375. return dt;
  376. }
  377. static DataType cPreChange(DataType dt, int change, const char* name) {
  378. if(!dtRemoveVariable(&dt) || !dtCompare(dt, dtInt())) {
  379. cError("%s needs an int reference", name);
  380. }
  381. if(onLine) {
  382. cAddByteOperation(OP_INT_CHANGE, change);
  383. return dtVoid();
  384. }
  385. cAddByteOperation(OP_PUSH_PRE_INT_CHANGE, change);
  386. return dt;
  387. }
  388. static DataType cPreUnary() {
  389. if(cConsumeTokenIf(T_INCREMENT)) {
  390. return cPreChange(cPreUnary(), 1, "++");
  391. } else if(cConsumeTokenIf(T_DECREMENT)) {
  392. return cPreChange(cPreUnary(), -1, "--");
  393. } else if(cConsumeTokenIf(T_SUB)) {
  394. DataType dt = cUnpack(cPreUnary());
  395. if(dtCompare(dt, dtInt())) {
  396. cAddOperation(OP_INVERT_SIGN_INT);
  397. } else if(dtCompare(dt, dtFloat())) {
  398. cAddOperation(OP_INVERT_SIGN_FLOAT);
  399. } else {
  400. cError("cannot invert sign of %s", cGetName(dt));
  401. }
  402. return dt;
  403. } else if(cConsumeTokenIf(T_NOT)) {
  404. DataType dt = cPreUnary();
  405. if(!dtCompare(dt, dtBool())) {
  406. cError("! needs a bool not %s", cGetName(dt));
  407. }
  408. cAddOperation(OP_NOT);
  409. return dt;
  410. } else if(cConsumeTokenIf(T_BIT_NOT)) {
  411. DataType dt = cPreUnary();
  412. if(!dtCompare(dt, dtInt())) {
  413. cError("~ needs an int not %s", cGetName(dt));
  414. }
  415. cAddOperation(OP_BIT_NOT);
  416. return dt;
  417. } else if(cConsumeTokenIf(T_BIT_AND)) {
  418. DataType dt = cPreUnary();
  419. if(!dtRemoveVariable(&dt)) {
  420. cError("& needs a reference");
  421. }
  422. return dtDereference(dt);
  423. } else if(cConsumeTokenIf(T_MUL)) {
  424. DataType dt = cPreUnary();
  425. if(!dtIsPointer(dt)) {
  426. cError("* expects a pointer");
  427. }
  428. dt = dtReference(dt);
  429. if(!dtIsPointer(dt) && !dtIsVariable(dt)) {
  430. dt = dtToVariable(dt);
  431. } else {
  432. cAddOperation(OP_REFERENCE);
  433. }
  434. return dt;
  435. }
  436. return cAccess();
  437. }
  438. static void cAddTypeOperation(DataType a, DataType b, const TypedOp* op) {
  439. if(dtCompare(a, dtInt()) && dtCompare(b, dtInt()) &&
  440. op->intOp != OP_NOTHING) {
  441. cAddOperation(op->intOp);
  442. } else if(dtCompare(a, dtFloat()) && dtCompare(b, dtFloat()) &&
  443. op->floatOp != OP_NOTHING) {
  444. cAddOperation(op->floatOp);
  445. } else if(dtCompare(a, dtBool()) && dtCompare(b, dtBool()) &&
  446. op->boolOp != OP_NOTHING) {
  447. cAddOperation(op->boolOp);
  448. } else if(dtCompare(a, b) && dtIsPointer(a) &&
  449. op->pointerOp != OP_NOTHING) {
  450. cAddOperation(op->pointerOp);
  451. } else {
  452. cInvalidOperation(a, b, op->name);
  453. }
  454. }
  455. static DataType cMul() {
  456. DataType a = cPreUnary();
  457. while(true) {
  458. if(cConsumeTokenIf(T_MUL)) {
  459. a = cUnpack(a);
  460. cAddTypeOperation(a, cUnpack(cPreUnary()), &TYPED_MUL);
  461. } else if(cConsumeTokenIf(T_DIV)) {
  462. a = cUnpack(a);
  463. cAddTypeOperation(a, cUnpack(cPreUnary()), &TYPED_DIV);
  464. } else if(cConsumeTokenIf(T_MOD)) {
  465. a = cUnpack(a);
  466. cAddTypeOperation(a, cUnpack(cPreUnary()), &TYPED_MOD);
  467. } else {
  468. break;
  469. }
  470. }
  471. return a;
  472. }
  473. static DataType cAdd() {
  474. DataType a = cMul();
  475. while(true) {
  476. if(cConsumeTokenIf(T_ADD)) {
  477. a = cUnpack(a);
  478. cAddTypeOperation(a, cUnpack(cMul()), &TYPED_ADD);
  479. } else if(cConsumeTokenIf(T_SUB)) {
  480. a = cUnpack(a);
  481. cAddTypeOperation(a, cUnpack(cMul()), &TYPED_SUB);
  482. } else {
  483. break;
  484. }
  485. }
  486. return a;
  487. }
  488. static DataType cShift() {
  489. DataType a = cAdd();
  490. while(true) {
  491. if(cConsumeTokenIf(T_LEFT_SHIFT)) {
  492. a = cUnpack(a);
  493. cAddTypeOperation(a, cUnpack(cAdd()), &TYPED_LEFT_SHIFT);
  494. } else if(cConsumeTokenIf(T_RIGHT_SHIFT)) {
  495. a = cUnpack(a);
  496. cAddTypeOperation(a, cUnpack(cAdd()), &TYPED_RIGHT_SHIFT);
  497. } else {
  498. break;
  499. }
  500. }
  501. return a;
  502. }
  503. static DataType cComparison() {
  504. DataType a = cShift();
  505. while(true) {
  506. if(cConsumeTokenIf(T_LESS)) {
  507. a = cUnpack(a);
  508. cAddTypeOperation(a, cUnpack(cShift()), &TYPED_LESS);
  509. a = dtBool();
  510. } else if(cConsumeTokenIf(T_LESS_EQUAL)) {
  511. a = cUnpack(a);
  512. cAddTypeOperation(a, cUnpack(cShift()), &TYPED_LESS_EQUAL);
  513. cAddOperation(OP_NOT);
  514. a = dtBool();
  515. } else if(cConsumeTokenIf(T_GREATER)) {
  516. a = cUnpack(a);
  517. cAddTypeOperation(a, cUnpack(cShift()), &TYPED_GREATER);
  518. a = dtBool();
  519. } else if(cConsumeTokenIf(T_GREATER_EQUAL)) {
  520. a = cUnpack(a);
  521. cAddTypeOperation(a, cUnpack(cShift()), &TYPED_GREATER_EQUAL);
  522. cAddOperation(OP_NOT);
  523. a = dtBool();
  524. } else {
  525. break;
  526. }
  527. }
  528. return a;
  529. }
  530. static DataType cEqual() {
  531. DataType a = cComparison();
  532. while(true) {
  533. if(cConsumeTokenIf(T_EQUAL)) {
  534. a = cUnpack(a);
  535. cAddTypeOperation(a, cUnpack(cComparison()), &TYPED_EQUAL);
  536. a = dtBool();
  537. } else if(cConsumeTokenIf(T_NOT_EQUAL)) {
  538. a = cUnpack(a);
  539. cAddTypeOperation(a, cUnpack(cComparison()), &TYPED_NOT_EQUAL);
  540. cAddOperation(OP_NOT);
  541. a = dtBool();
  542. } else {
  543. break;
  544. }
  545. }
  546. return a;
  547. }
  548. static DataType cBitAnd() {
  549. DataType a = cEqual();
  550. while(cConsumeTokenIf(T_BIT_AND)) {
  551. a = cUnpack(a);
  552. cAddTypeOperation(a, cUnpack(cEqual()), &TYPED_BIT_AND);
  553. }
  554. return a;
  555. }
  556. static DataType cBitXor() {
  557. DataType a = cBitAnd();
  558. while(cConsumeTokenIf(T_BIT_XOR)) {
  559. a = cUnpack(a);
  560. cAddTypeOperation(a, cUnpack(cBitAnd()), &TYPED_BIT_XOR);
  561. }
  562. return a;
  563. }
  564. static DataType cBitOr() {
  565. DataType a = cBitXor();
  566. while(cConsumeTokenIf(T_BIT_OR)) {
  567. a = cUnpack(a);
  568. cAddTypeOperation(a, cUnpack(cBitXor()), &TYPED_BIT_OR);
  569. }
  570. return a;
  571. }
  572. static DataType cAnd() {
  573. DataType a = cBitOr();
  574. while(cConsumeTokenIf(T_AND)) {
  575. a = cUnpack(a);
  576. cAddOperation(OP_PEEK_FALSE_GOTO);
  577. int p = cReserveInt();
  578. DataType b = cUnpack(cBitOr());
  579. if(!dtCompare(a, dtBool()) || !dtCompare(b, dtBool())) {
  580. cInvalidOperation(a, b, "&&");
  581. }
  582. cAddOperation(OP_AND);
  583. cSetInt(p, code->length);
  584. }
  585. return a;
  586. }
  587. static DataType cOr() {
  588. DataType a = cAnd();
  589. while(cConsumeTokenIf(T_OR)) {
  590. a = cUnpack(a);
  591. cAddOperation(OP_PEEK_TRUE_GOTO);
  592. int p = cReserveInt();
  593. DataType b = cUnpack(cAnd());
  594. if(!dtCompare(a, dtBool()) || !dtCompare(b, dtBool())) {
  595. cInvalidOperation(a, b, "||");
  596. }
  597. cAddOperation(OP_OR);
  598. cSetInt(p, code->length);
  599. }
  600. return a;
  601. }
  602. static DataType cExpression() {
  603. return cOr();
  604. }
  605. static void cOperationSet(DataType left, const TypedOp* op) {
  606. cAddOperation(OP_DUPLICATE_REFERENCE);
  607. cLoadRef(left);
  608. DataType right = cUnpackedExpression();
  609. cAddTypeOperation(left, right, op);
  610. cStore(left, right, "=");
  611. }
  612. static void cAddPostLineChange(DataType dt, int change, const char* name) {
  613. if(!dtCompare(dt, dtInt())) {
  614. cError("%s needs an int", name);
  615. }
  616. cAddByteOperation(OP_INT_CHANGE, change);
  617. }
  618. static void cDeclareStruct(Struct* st) {
  619. DataType dt = cExtendType(dtStruct(st));
  620. cConsumeToken(T_LITERAL);
  621. const char* var = cReadString();
  622. if(vsInScope(&vars, var)) {
  623. cDeclared(var);
  624. }
  625. Variable* v = vsAdd(&vars, var, dt, &structs);
  626. if(dtIsPointer(dt)) {
  627. cConsumeToken(T_SET);
  628. cAddIntOperation(OP_DEREFERENCE_VAR, v->address);
  629. cStore(v->type, cUnpackedExpression(), "=");
  630. }
  631. }
  632. static void cLine();
  633. static void cConsumeBody() {
  634. int oldLine = line;
  635. while(!cConsumeTokenIf(T_CLOSE_CURVED_BRACKET)) {
  636. if(tPeekToken() == T_END) {
  637. line = oldLine;
  638. cError("unexpected end of file: non closed curved bracket");
  639. }
  640. cLine();
  641. }
  642. }
  643. static void cConsumeScope() {
  644. Scope scope;
  645. vsEnterScope(&vars, &scope);
  646. cConsumeBody();
  647. vsLeaveScope(&vars, &scope);
  648. }
  649. static void cAddReturn(Operation op) {
  650. cAddOperation(op);
  651. returns[returnIndex++] = cReserveInt();
  652. }
  653. static void cReturn() {
  654. if(returnIndex >= RETURN_BUFFER) {
  655. cError("too much returns in function");
  656. }
  657. if(dtCompare(returnType, dtVoid())) {
  658. cConsumeToken(T_SEMICOLON);
  659. cAddReturn(OP_RETURN);
  660. hasReturn = 2;
  661. return;
  662. }
  663. DataType dt = cUnpackedExpression();
  664. if(!dtCompare(dt, returnType)) {
  665. cError("wrong return type, should be %s", cGetName(returnType));
  666. }
  667. if(dtCompare(dt, dtInt())) {
  668. cAddReturn(OP_RETURN_INT);
  669. } else if(dtCompare(dt, dtBool())) {
  670. cAddReturn(OP_RETURN_BOOL);
  671. } else if(dtCompare(dt, dtFloat())) {
  672. cAddReturn(OP_RETURN_FLOAT);
  673. } else if(dtIsPointer(dt)) {
  674. cAddReturn(OP_RETURN_POINTER);
  675. } else {
  676. cError("cannot return %s", cGetName(dt));
  677. }
  678. cConsumeToken(T_SEMICOLON);
  679. hasReturn = 2;
  680. }
  681. static void cPrint() {
  682. DataType dt = cUnpackedExpression();
  683. if(dtIsPointer(dt)) {
  684. cAddOperation(OP_PRINT_POINTER);
  685. cConsumeToken(T_SEMICOLON);
  686. return;
  687. }
  688. switch(dt.type) {
  689. DT_OPERATION(PRINT);
  690. default: cError("cannot print type %s", cGetName(dt));
  691. }
  692. cConsumeToken(T_SEMICOLON);
  693. }
  694. static void cIf() {
  695. cConsumeToken(T_OPEN_BRACKET);
  696. DataType dt = cUnpackedExpression();
  697. if(!dtCompare(dt, dtBool())) {
  698. cError("if expects a bool not %s", cGetName(dt));
  699. }
  700. cConsumeToken(T_CLOSE_BRACKET);
  701. cAddOperation(OP_IF_GOTO);
  702. int ifP = cReserveInt();
  703. cConsumeToken(T_OPEN_CURVED_BRACKET);
  704. cConsumeScope();
  705. cSetInt(ifP, code->length);
  706. if(cConsumeTokenIf(T_ELSE)) {
  707. cAddOperation(OP_GOTO);
  708. int elseP = cReserveInt();
  709. cSetInt(ifP, code->length);
  710. if(cConsumeTokenIf(T_IF)) {
  711. cIf();
  712. } else {
  713. cConsumeToken(T_OPEN_CURVED_BRACKET);
  714. cConsumeScope();
  715. }
  716. cSetInt(elseP, code->length);
  717. }
  718. }
  719. static void cConsumeBreaks(int start, int address) {
  720. for(int i = start; i < breakIndex; i++) {
  721. cSetInt(breaks[i], address);
  722. }
  723. breakIndex = start;
  724. }
  725. static void cWhile() {
  726. int start = code->length;
  727. cConsumeToken(T_OPEN_BRACKET);
  728. DataType dt = cUnpackedExpression();
  729. if(!dtCompare(dt, dtBool())) {
  730. cError("while expects a bool not %s", cGetName(dt));
  731. }
  732. cConsumeToken(T_CLOSE_BRACKET);
  733. cAddOperation(OP_IF_GOTO);
  734. int ifP = cReserveInt();
  735. int breakStart = breakIndex;
  736. forWhileStack++;
  737. int oldContinue = continueAt;
  738. continueAt = start;
  739. cConsumeToken(T_OPEN_CURVED_BRACKET);
  740. cConsumeScope();
  741. continueAt = oldContinue;
  742. forWhileStack--;
  743. cAddIntOperation(OP_GOTO, start);
  744. cSetInt(ifP, code->length);
  745. cConsumeBreaks(breakStart, code->length);
  746. }
  747. static void cDeclare(DataType dt) {
  748. dt = cExtendType(dt);
  749. cConsumeToken(T_LITERAL);
  750. const char* var = cReadString();
  751. if(vsInScope(&vars, var)) {
  752. cDeclared(var);
  753. }
  754. Variable* v = vsAdd(&vars, var, dt, &structs);
  755. cConsumeToken(T_SET);
  756. cAddIntOperation(OP_DEREFERENCE_VAR, v->address);
  757. cStore(v->type, cUnpackedExpression(), "=");
  758. }
  759. static void cDelete() {
  760. DataType pointer = cUnpackedExpression();
  761. if(!dtIsPointer(pointer)) {
  762. cError("delete expects a pointer");
  763. }
  764. cAddOperation(OP_DELETE);
  765. }
  766. static void cSetVariable() {
  767. onLine = true;
  768. DataType dt = cPreUnary();
  769. onLine = false;
  770. if(dtCompare(dt, dtVoid())) {
  771. return;
  772. }
  773. if(!dtRemoveVariable(&dt)) {
  774. cError("return value not used: %s", cGetName(dt));
  775. }
  776. Token t = cReadTokenAndLine();
  777. switch(t) {
  778. case T_SET: cStore(dt, cUnpackedExpression(), "="); break;
  779. case T_ADD_SET: cOperationSet(dt, &TYPED_ADD); break;
  780. case T_SUB_SET: cOperationSet(dt, &TYPED_SUB); break;
  781. case T_MUL_SET: cOperationSet(dt, &TYPED_MUL); break;
  782. case T_DIV_SET: cOperationSet(dt, &TYPED_DIV); break;
  783. case T_MOD_SET: cOperationSet(dt, &TYPED_MOD); break;
  784. case T_BIT_AND_SET: cOperationSet(dt, &TYPED_BIT_AND); break;
  785. case T_BIT_OR_SET: cOperationSet(dt, &TYPED_BIT_OR); break;
  786. case T_BIT_XOR_SET: cOperationSet(dt, &TYPED_BIT_XOR); break;
  787. case T_LEFT_SHIFT_SET: cOperationSet(dt, &TYPED_LEFT_SHIFT); break;
  788. case T_RIGHT_SHIFT_SET: cOperationSet(dt, &TYPED_RIGHT_SHIFT); break;
  789. case T_INCREMENT: cAddPostLineChange(dt, 1, "++"); break;
  790. case T_DECREMENT: cAddPostLineChange(dt, -1, "--"); break;
  791. default: cUnexpectedToken(t);
  792. }
  793. }
  794. static void cLineExpression() {
  795. int marker = tGetMarker();
  796. Token t = cReadTokenAndLine();
  797. if(t == T_LITERAL) {
  798. const char* literal = cReadString();
  799. Struct* st = stsSearch(&structs, literal);
  800. if(st != NULL) {
  801. cDeclareStruct(st);
  802. return;
  803. }
  804. }
  805. switch(t) {
  806. case T_INT: cDeclare(dtInt()); break;
  807. case T_BOOL: cDeclare(dtBool()); break;
  808. case T_FLOAT: cDeclare(dtFloat()); break;
  809. case T_DELETE: cDelete(); break;
  810. default: tReset(marker); cSetVariable();
  811. }
  812. }
  813. static void cFor() {
  814. Scope scope;
  815. vsEnterScope(&vars, &scope);
  816. cConsumeToken(T_OPEN_BRACKET);
  817. cLineExpression();
  818. cConsumeToken(T_SEMICOLON);
  819. int startCheck = code->length;
  820. DataType dt = cUnpackedExpression();
  821. if(!dtCompare(dt, dtBool())) {
  822. cError("for expects a bool not %s", cGetName(dt));
  823. }
  824. cConsumeToken(T_SEMICOLON);
  825. cAddOperation(OP_IF_GOTO);
  826. int end = cReserveInt();
  827. cAddOperation(OP_GOTO);
  828. int beginBody = cReserveInt();
  829. int startPerLoop = code->length;
  830. cLineExpression();
  831. cAddIntOperation(OP_GOTO, startCheck);
  832. cConsumeToken(T_CLOSE_BRACKET);
  833. cSetInt(beginBody, code->length);
  834. int breakStart = breakIndex;
  835. forWhileStack++;
  836. int oldContinue = continueAt;
  837. continueAt = startPerLoop;
  838. cConsumeToken(T_OPEN_CURVED_BRACKET);
  839. cConsumeBody();
  840. continueAt = oldContinue;
  841. forWhileStack--;
  842. cAddIntOperation(OP_GOTO, startPerLoop);
  843. cSetInt(end, code->length);
  844. cConsumeBreaks(breakStart, code->length);
  845. vsLeaveScope(&vars, &scope);
  846. }
  847. static void cBreak() {
  848. if(forWhileStack == 0) {
  849. cError("break without for or while on line %d", line);
  850. } else if(breakIndex >= BREAK_BUFFER) {
  851. cError("too much breaks around line %d", line);
  852. }
  853. cAddOperation(OP_GOTO);
  854. breaks[breakIndex++] = cReserveInt();
  855. cConsumeToken(T_SEMICOLON);
  856. }
  857. static void cContinue() {
  858. if(forWhileStack == 0) {
  859. cError("continue without for or while on line %d", line);
  860. }
  861. cAddIntOperation(OP_GOTO, continueAt);
  862. cConsumeToken(T_SEMICOLON);
  863. }
  864. static void cLine() {
  865. int marker = tGetMarker();
  866. Token t = cReadTokenAndLine();
  867. cAddOperation(OP_LINE);
  868. cAddInt16(line);
  869. switch(t) {
  870. case T_OPEN_CURVED_BRACKET: cConsumeScope(); break;
  871. case T_PRINT: cPrint(); break;
  872. case T_RETURN: cReturn(); break;
  873. case T_IF: cIf(); break;
  874. case T_WHILE: cWhile(); break;
  875. case T_FOR: cFor(); break;
  876. case T_BREAK: cBreak(); break;
  877. case T_CONTINUE: cContinue(); break;
  878. default:
  879. tReset(marker);
  880. cLineExpression();
  881. cConsumeToken(T_SEMICOLON);
  882. }
  883. }
  884. static void cFunctionArgument(Function* f);
  885. static void cFunctionCommaOrEnd(Function* f) {
  886. if(cConsumeTokenIf(T_CLOSE_BRACKET)) {
  887. return;
  888. }
  889. cConsumeToken(T_COMMA);
  890. cFunctionArgument(f);
  891. }
  892. static void cFunctionAddArgument(Function* f, DataType dt) {
  893. dt = cExtendType(dt);
  894. cConsumeToken(T_LITERAL);
  895. const char* name = cReadString();
  896. if(vsInScope(&vars, name)) {
  897. cDeclared(name);
  898. }
  899. vsAdd(&vars, name, dt, &structs);
  900. if(fAddArgument(f, dt, &structs)) {
  901. cTooMuchArguments();
  902. }
  903. cFunctionCommaOrEnd(f);
  904. }
  905. static void cFunctionArgument(Function* f) {
  906. Token t = cReadTokenAndLine();
  907. switch(t) {
  908. case T_INT: cFunctionAddArgument(f, dtInt()); break;
  909. case T_FLOAT: cFunctionAddArgument(f, dtFloat()); break;
  910. case T_BOOL: cFunctionAddArgument(f, dtBool()); break;
  911. case T_LITERAL: cFunctionAddArgument(f, cReadStruct()); break;
  912. default: cUnexpectedToken(t);
  913. }
  914. }
  915. static void cFunctionArguments(Function* f) {
  916. cConsumeToken(T_OPEN_BRACKET);
  917. if(!cConsumeTokenIf(T_CLOSE_BRACKET)) {
  918. cFunctionArgument(f);
  919. }
  920. }
  921. static int cReserve(int offset) {
  922. cAddOperation(OP_RESERVE);
  923. int p = cReserveInt();
  924. cAddInt(offset);
  925. return p;
  926. }
  927. static void cFree(int p, int bytes) {
  928. cAddIntOperation(OP_RETURN, bytes);
  929. cSetInt(p, bytes);
  930. }
  931. static void cLinkReturns(int bytes) {
  932. for(int i = 0; i < returnIndex; i++) {
  933. cSetInt(returns[i], bytes);
  934. }
  935. returnIndex = 0;
  936. }
  937. static void cInnerFunction(Function* f) {
  938. cConsumeToken(T_OPEN_CURVED_BRACKET);
  939. int p = cReserve(f->size);
  940. returnIndex = 0;
  941. cConsumeScope();
  942. if(!dtCompare(returnType, dtVoid()) && hasReturn <= 0) {
  943. cError("missing return");
  944. }
  945. cFree(p, vars.maxAddress);
  946. cLinkReturns(vars.maxAddress);
  947. }
  948. static bool cForwardFunction(Function* found, Function* f) {
  949. if(!cConsumeTokenIf(T_SEMICOLON)) {
  950. return false;
  951. } else if(found != NULL) {
  952. cError("function registered twice");
  953. }
  954. f->address = -1;
  955. fsAdd(&functions, f);
  956. return true;
  957. }
  958. static void cBuildFunction(Function* f, DataType rType) {
  959. cConsumeToken(T_LITERAL);
  960. fInit(f, cReadString(), line);
  961. f->returnType = rType;
  962. vsReset(&vars);
  963. cFunctionArguments(f);
  964. }
  965. static void cFunction(DataType rType) {
  966. rType = cExtendType(rType);
  967. Function f;
  968. cBuildFunction(&f, rType);
  969. Function* found = fsSearch(&functions, &f);
  970. if(cForwardFunction(found, &f)) {
  971. return;
  972. }
  973. cAddOperation(OP_LINE);
  974. cAddInt16(line);
  975. cAddOperation(OP_GOTO);
  976. int end = cReserveInt();
  977. f.address = code->length;
  978. if(found != NULL) {
  979. if(found->address == -1) {
  980. found->address = f.address;
  981. } else {
  982. cError("function registered twice");
  983. }
  984. } else {
  985. fsAdd(&functions, &f);
  986. }
  987. returnType = rType;
  988. cInnerFunction(&f);
  989. cSetInt(end, code->length);
  990. }
  991. static void cStruct() {
  992. cConsumeToken(T_LITERAL);
  993. const char* name = cReadString();
  994. if(stsSearch(&structs, name) != NULL) {
  995. cError("struct registered twice");
  996. }
  997. Struct* st = stsAdd(&structs, name);
  998. DataType self = dtStruct(st);
  999. cConsumeToken(T_OPEN_CURVED_BRACKET);
  1000. while(!cConsumeTokenIf(T_CLOSE_CURVED_BRACKET)) {
  1001. DataType dt = cReadType();
  1002. if(dtCompare(dt, self)) {
  1003. cError("struct %s contains itself", name);
  1004. }
  1005. cConsumeToken(T_LITERAL);
  1006. const char* name = cReadString();
  1007. stAddVariable(st, name, dt);
  1008. cConsumeToken(T_SEMICOLON);
  1009. }
  1010. cConsumeToken(T_SEMICOLON);
  1011. }
  1012. static void cGlobalScope(Token t) {
  1013. switch(t) {
  1014. case T_VOID: cFunction(dtVoid()); break;
  1015. case T_INT: cFunction(dtInt()); break;
  1016. case T_BOOL: cFunction(dtBool()); break;
  1017. case T_FLOAT: cFunction(dtFloat()); break;
  1018. case T_LITERAL: cFunction(cReadStruct()); break;
  1019. case T_STRUCT: cStruct(); break;
  1020. default: cUnexpectedToken(t);
  1021. }
  1022. }
  1023. static void cCallMain() {
  1024. Function f;
  1025. fInit(&f, "main", line);
  1026. Function* found = fsSearch(&functions, &f);
  1027. if(found != NULL && dtCompare(found->returnType, dtVoid())) {
  1028. cAddIntOperation(OP_PUSH_INT, 0);
  1029. cAddIntOperation(OP_GOSUB, found->address);
  1030. cAddInt(found->size);
  1031. }
  1032. }
  1033. static void cForEachLine() {
  1034. Token t = cReadTokenAndLine();
  1035. while(t != T_END) {
  1036. cGlobalScope(t);
  1037. t = cReadTokenAndLine();
  1038. }
  1039. cCallMain();
  1040. }
  1041. static void cLinkQueuedFunctions() {
  1042. for(int i = 0; i < functionQueue.entries; i++) {
  1043. Function* f = functionQueue.data + i;
  1044. Function* found = fsSearch(&functions, f);
  1045. if(found == NULL) {
  1046. line = f->line;
  1047. cError("unknown function");
  1048. } else if(!dtCompare(f->returnType, found->returnType)) {
  1049. line = f->line;
  1050. cError("function return type is not %s", cGetName(f->returnType));
  1051. }
  1052. cSetInt(f->address, found->address);
  1053. }
  1054. }
  1055. static void cAllocAndCompile() {
  1056. forWhileStack = 0;
  1057. breakIndex = 0;
  1058. returnType = dtVoid();
  1059. onLine = false;
  1060. vsInit(&vars);
  1061. fsInit(&functions);
  1062. fsInit(&functionQueue);
  1063. stsInit(&structs);
  1064. if(!setjmp(errorJump)) {
  1065. cForEachLine();
  1066. cLinkQueuedFunctions();
  1067. }
  1068. stsDelete(&structs);
  1069. fsDelete(&functionQueue);
  1070. fsDelete(&functions);
  1071. vsDelete(&vars);
  1072. }
  1073. ByteCode* cCompile() {
  1074. error[0] = '\0';
  1075. code = bcInit();
  1076. cAllocAndCompile();
  1077. if(error[0] != '\0') {
  1078. bcDelete(code);
  1079. return NULL;
  1080. }
  1081. return code;
  1082. }
  1083. const char* cGetError() {
  1084. return error;
  1085. }
  1086. int cGetLine() {
  1087. return line;
  1088. }