Compiler.c 33 KB

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