Compiler.c 31 KB

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