Compiler.c 32 KB

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