Compiler.c 33 KB

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