Compiler.c 33 KB

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