KSGSLeser.cpp 31 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441
  1. #include "KSGSLeser.h"
  2. #include <Datei.h>
  3. #include "../Error/Error.h"
  4. #include "KSGSCompile.h"
  5. #include "../Befehl/KSGSKlasse.h"
  6. #include "../Klassen/KSGSTyp.h"
  7. #include "../Funktionen/KSGSRückruf.h"
  8. #include "../Main/KSGScriptObj.h"
  9. using namespace KSGScript;
  10. void KSGScript::removeLehr( Text *txt )
  11. {
  12. if( !txt->getLength() )
  13. return;
  14. while( txt->getLength() && ( *txt[ 0 ] == ' ' || *txt[ 0 ] == '\n' || *txt[ 0 ] == '\r' || *txt[ 0 ] == '\t' ) )
  15. txt->remove( 0 );
  16. while( txt->getLength() && ( txt->getText()[ txt->getLength() - 1 ] == ' ' || txt->getText()[ txt->getLength() - 1 ] == '\n' ||
  17. txt->getText()[ txt->getLength() - 1 ] == '\r' || txt->getText()[ txt->getLength() - 1 ] == '\t' ) )
  18. txt->remove( txt->getLength() - 1 );
  19. }
  20. void KSGScript::removeKlammer( Text *txt )
  21. {
  22. if( !txt->getLength() )
  23. return;
  24. removeLehr( txt );
  25. while( *txt[ 0 ] == '(' && txt->getText()[ txt->getLength() - 1 ] == ')' )
  26. {
  27. int count = 0;
  28. for( int i = 0; i < txt->getLength(); i++ )
  29. {
  30. if( txt->getText()[ i ] == '(' )
  31. count++;
  32. if( txt->getText()[ i ] == ')' )
  33. count--;
  34. if( !count && i != txt->getLength() - 1 )
  35. return;
  36. }
  37. txt->remove( 0 );
  38. txt->remove( txt->getLength() - 1 );
  39. removeLehr( txt );
  40. if( !txt->getLength() )
  41. return;
  42. }
  43. }
  44. int KSGScript::hatOperator( Text *txt )
  45. {
  46. if( txt->hat( "+=" ) )
  47. return KSGS_O_PLUSSET;
  48. if( txt->hat( "-=" ) )
  49. return KSGS_O_MINUSSET;
  50. if( txt->hat( "*=" ) )
  51. return KSGS_O_MAHLSET;
  52. if( txt->hat( "/=" ) )
  53. return KSGS_O_GETEILTSET;
  54. if( txt->hat( "&=" ) )
  55. return KSGS_O_UNDSET;
  56. if( txt->hat( "|=" ) )
  57. return KSGS_O_ODERSET;
  58. if( txt->hat( "==" ) )
  59. return KSGS_O_GLEICH;
  60. if( txt->hat( "<=" ) )
  61. return KSGS_O_KLEINERGLEICH;
  62. if( txt->hat( ">=" ) )
  63. return KSGS_O_GRÖßERGLEICH;
  64. if( txt->hat( "!=" ) )
  65. return KSGS_O_UNGLEICH;
  66. if( txt->hat( "||" ) )
  67. return KSGS_O_ODER;
  68. if( txt->hat( "&&" ) )
  69. return KSGS_O_UND;
  70. if( txt->hat( "++" ) )
  71. return KSGS_O_PLUS1;
  72. if( txt->hat( "--" ) )
  73. return KSGS_O_MINUS1;
  74. if( txt->hat( "<<" ) )
  75. return KSGS_O_NACHLINKS;
  76. if( txt->hat( ">>" ) )
  77. return KSGS_O_NACHRECHTS;
  78. if( txt->hat( "=" ) )
  79. return KSGS_O_SET;
  80. if( txt->hat( "<" ) )
  81. return KSGS_O_KLEINER;
  82. if( txt->hat( ">" ) )
  83. return KSGS_O_GRÖßER;
  84. if( txt->hat( "|" ) )
  85. return KSGS_O_BITODER;
  86. if( txt->hat( "&" ) )
  87. return KSGS_O_BITUND;
  88. if( txt->hat( "+" ) )
  89. return KSGS_O_PLUS;
  90. if( txt->hat( "-" ) )
  91. return KSGS_O_MINUS;
  92. if( txt->hat( "*" ) )
  93. return KSGS_O_MAHL;
  94. if( txt->hat( "/" ) )
  95. return KSGS_O_GETEILT;
  96. if( txt->hat( "%" ) )
  97. return KSGS_O_REST;
  98. if( txt->hat( "!" ) )
  99. return KSGS_O_NICHT;
  100. if( txt->hat( "~" ) )
  101. return KSGS_O_BITNICHT;
  102. return -1;
  103. }
  104. int KSGScript::getOperatorPos( Text *txt, int *län )
  105. {
  106. *län = 2;
  107. if( txt->hat( "+=" ) )
  108. return txt->positionVon( "+=" );
  109. if( txt->hat( "-=" ) )
  110. return txt->positionVon( "-=" );
  111. if( txt->hat( "*=" ) )
  112. return txt->positionVon( "*=" );
  113. if( txt->hat( "/=" ) )
  114. return txt->positionVon( "/=" );
  115. if( txt->hat( "&=" ) )
  116. return txt->positionVon( "&=" );
  117. if( txt->hat( "|=" ) )
  118. return txt->positionVon( "|=" );
  119. if( txt->hat( "==" ) )
  120. return txt->positionVon( "==" );
  121. if( txt->hat( "<=" ) )
  122. return txt->positionVon( "<=" );
  123. if( txt->hat( ">=" ) )
  124. return txt->positionVon( ">=" );
  125. if( txt->hat( "!=" ) )
  126. return txt->positionVon( "!=" );
  127. if( txt->hat( "||" ) )
  128. return txt->positionVon( "||" );
  129. if( txt->hat( "&&" ) )
  130. return txt->positionVon( "&&" );
  131. if( txt->hat( "++" ) )
  132. return txt->positionVon( "++" );
  133. if( txt->hat( "--" ) )
  134. return txt->positionVon( "--" );
  135. if( txt->hat( "<<" ) )
  136. return txt->positionVon( "<<" );
  137. if( txt->hat( ">>" ) )
  138. return txt->positionVon( ">>" );
  139. *län = 1;
  140. if( txt->hat( "=" ) )
  141. return txt->positionVon( "=" );
  142. if( txt->hat( "<" ) )
  143. return txt->positionVon( "<" );
  144. if( txt->hat( ">" ) )
  145. return txt->positionVon( ">" );
  146. if( txt->hat( "|" ) )
  147. return txt->positionVon( "|" );
  148. if( txt->hat( "&" ) )
  149. return txt->positionVon( "&" );
  150. if( txt->hat( "+" ) )
  151. return txt->positionVon( "+" );
  152. if( txt->hat( "-" ) )
  153. return txt->positionVon( "-" );
  154. if( txt->hat( "*" ) )
  155. return txt->positionVon( "*" );
  156. if( txt->hat( "/" ) )
  157. return txt->positionVon( "/" );
  158. if( txt->hat( "%" ) )
  159. return txt->positionVon( "%" );
  160. if( txt->hat( "!" ) )
  161. return txt->positionVon( "!" );
  162. if( txt->hat( "~" ) )
  163. return txt->positionVon( "~" );
  164. *län = 0;
  165. return -1;
  166. }
  167. // Lese Strukturen
  168. KSGSLeseBefehl::~KSGSLeseBefehl()
  169. {
  170. int anz = listA.getEintragAnzahl();
  171. for( int i = 0; i < anz; i++ )
  172. delete listA.get( i );
  173. anz = listB.getEintragAnzahl();
  174. for( int i = 0; i < anz; i++ )
  175. delete listB.get( i );
  176. }
  177. KSGSLeseFunktion::~KSGSLeseFunktion()
  178. {
  179. int anz3 = parameter.getEintragAnzahl();
  180. for( int k = 0; k < anz3; k++ )
  181. delete parameter.get( k );
  182. anz3 = befehle.getEintragAnzahl();
  183. for( int k = 0; k < anz3; k++ )
  184. delete befehle.get( k );
  185. }
  186. KSGSLeseKlasse::~KSGSLeseKlasse()
  187. {
  188. int anz2 = variablen.getEintragAnzahl();
  189. for( int j = 0; j < anz2; j++ )
  190. delete variablen.get( j );
  191. anz2 = funktionen.getEintragAnzahl();
  192. for( int j = 0; j < anz2; j++ )
  193. delete funktionen.get( j );
  194. }
  195. KSGSLeseScript::~KSGSLeseScript()
  196. {
  197. int anz = variablen.getEintragAnzahl();
  198. for( int i = 0; i < anz; i++ )
  199. delete variablen.get( i );
  200. anz = funktionen.getEintragAnzahl();
  201. for( int i = 0; i < anz; i++ )
  202. delete funktionen.get( i );
  203. anz = klassen.getEintragAnzahl();
  204. for( int i = 0; i < anz; i++ )
  205. delete klassen.get( i );
  206. }
  207. // Inhalt der KSGSLeser klasse aus KSGSLeser.h
  208. // Konstruktor
  209. KSGSLeser::KSGSLeser( const char *pfad, KSGScriptObj *zObj )
  210. {
  211. this->zObj = zObj;
  212. d = 0;
  213. dat = 0;
  214. this->pfad = new Text( pfad );
  215. zeile = 0;
  216. mainFuncId = -1;
  217. mausFuncId = -1;
  218. tastaturFuncId = -1;
  219. tickFuncId = -1;
  220. renderFuncId = -1;
  221. ref = 1;
  222. }
  223. // Destruktor
  224. KSGSLeser::~KSGSLeser()
  225. {
  226. delete dat;
  227. pfad->release();
  228. }
  229. // privat
  230. // Script Laden
  231. bool KSGSLeser::ladeDatei()
  232. {
  233. bool ok = 1;
  234. d = new Datei();
  235. d->setDatei( *pfad );
  236. if( !d->open( Datei::Style::lesen ) )
  237. {
  238. d->release();
  239. error( 4, { *pfad }, zObj );
  240. return 0;
  241. }
  242. zeile = 1;
  243. while( !d->istEnde() )
  244. {
  245. bool br = 0;
  246. int id = leseNext();
  247. switch( id )
  248. {
  249. case -1: // Ende der Datei
  250. break;
  251. case 1: // Klasse
  252. if( 1 )
  253. {
  254. KSGSLeseKlasse *k = leseKlasse();
  255. if( !k )
  256. {
  257. error( 6, { "Klasse", *pfad }, zObj );
  258. br = 1;
  259. }
  260. else
  261. dat->klassen.add( k );
  262. }
  263. break;
  264. case 2: // funktion
  265. if( 1 )
  266. {
  267. KSGSLeseFunktion *f = leseFunktion();
  268. if( !f )
  269. {
  270. error( 6, { "Funktion", *pfad }, zObj );
  271. br = 1;
  272. }
  273. else
  274. dat->funktionen.add( f );
  275. }
  276. break;
  277. case 3: // Variable
  278. if( 1 )
  279. {
  280. KSGSLeseVariable *v = leseVariable();
  281. if( !v )
  282. {
  283. error( 6, { "Variable", *pfad }, zObj );
  284. br = 1;
  285. }
  286. else
  287. dat->variablen.add( v );
  288. }
  289. break;
  290. case 12: // lesen
  291. if( 1 )
  292. {
  293. if( !leseBis( '(' ) )
  294. {
  295. error( 6, { "Lade Anweisung", *pfad }, zObj );
  296. br = 1;
  297. break;
  298. }
  299. d->setLPosition( d->getLPosition() + 1, 0 );
  300. if( !leseBis( '"' ) )
  301. {
  302. error( 6, { "Lade Anweisung", *pfad }, zObj );
  303. br = 1;
  304. break;
  305. }
  306. d->setLPosition( d->getLPosition() + 1, 0 );
  307. __int64 end = nextPosOf( '"', 0 );
  308. if( end < 0 )
  309. {
  310. error( 6, { "Lade Anweisung", *pfad }, zObj );
  311. br = 1;
  312. break;
  313. }
  314. char *datei = new char[ (int)(end - d->getLPosition() ) + 1 ];
  315. datei[ end - d->getLPosition() ] = 0;
  316. d->lese( datei, (int)(end - d->getLPosition()) );
  317. Text *dPf = zObj->convertPfad( datei );
  318. delete[] datei;
  319. if( !leseBis( ')' ) )
  320. {
  321. error( 6, { "Lade Anweisung", *pfad }, zObj );
  322. br = 1;
  323. break;
  324. }
  325. d->setLPosition( d->getLPosition() + 1, 0 );
  326. Text *pf = new Text( pfad->getText() );
  327. pfad->setText( dPf );
  328. Datei *tmp = d;
  329. if( !ladeDatei() )
  330. {
  331. d = tmp;
  332. pfad->setText( pf );
  333. error( 6, { "Lade Anweisung", *pfad }, zObj );
  334. br = 1;
  335. break;
  336. }
  337. d = tmp;
  338. pfad->setText( pf );
  339. }
  340. break;
  341. default: // Fehler
  342. error( 5, { *pfad, Text() += zeile }, zObj );
  343. br = 1;
  344. break;
  345. }
  346. if( id == -1 )
  347. break;
  348. if( br )
  349. {
  350. ok = 0;
  351. break;
  352. }
  353. }
  354. d->close();
  355. d = d->release();
  356. return ok;
  357. }
  358. bool KSGSLeser::leseBis( char c )
  359. {
  360. __int64 pos = d->getLPosition();
  361. int tmpZ = zeile;
  362. char byte = 0;
  363. bool kommentar = 0;
  364. bool slash = 0;
  365. bool gefunden = 0;
  366. while( !d->istEnde() )
  367. {
  368. d->lese( &byte, 1 );
  369. if( byte == '\n' )
  370. {
  371. zeile++;
  372. kommentar = 0;
  373. continue;
  374. }
  375. if( byte == '#' )
  376. {
  377. kommentar = 1;
  378. continue;
  379. }
  380. if( byte == '/' )
  381. {
  382. if( slash )
  383. {
  384. kommentar = 1;
  385. slash = 0;
  386. }
  387. else
  388. slash = 1;
  389. continue;
  390. }
  391. else
  392. slash = 0;
  393. if( byte == c && !kommentar )
  394. {
  395. gefunden = 1;
  396. break;
  397. }
  398. }
  399. if( d->istEnde() && !gefunden )
  400. {
  401. d->setLPosition( pos, 0 );
  402. zeile = tmpZ;
  403. return 0;
  404. }
  405. d->setLPosition( d->getLPosition() - 1, 0 );
  406. return 1;
  407. }
  408. __int64 KSGSLeser::nextPosOf( char c, char c2 )
  409. {
  410. __int64 pos = d->getLPosition();
  411. char byte = 0;
  412. bool kommentar = 0;
  413. bool slash = 0;
  414. int count = 0;
  415. bool gefunden = 0;
  416. while( !d->istEnde() )
  417. {
  418. d->lese( &byte, 1 );
  419. if( byte == '\n' )
  420. {
  421. kommentar = 0;
  422. continue;
  423. }
  424. if( byte == '#' )
  425. {
  426. kommentar = 1;
  427. continue;
  428. }
  429. if( byte == '/' )
  430. {
  431. if( slash )
  432. {
  433. kommentar = 1;
  434. slash = 0;
  435. }
  436. else
  437. slash = 1;
  438. continue;
  439. }
  440. else
  441. slash = 0;
  442. if( !kommentar )
  443. {
  444. if( byte == c2 )
  445. {
  446. count++;
  447. continue;
  448. }
  449. if( byte == c )
  450. {
  451. if( !count )
  452. {
  453. gefunden = 1;
  454. break;
  455. }
  456. count--;
  457. continue;
  458. }
  459. }
  460. }
  461. if( d->istEnde() && !gefunden )
  462. {
  463. d->setLPosition( pos, 0 );
  464. return -1;
  465. }
  466. __int64 ret = d->getLPosition() - 1;
  467. d->setLPosition( pos, 0 );
  468. return ret;
  469. }
  470. bool KSGSLeser::leseBisText()
  471. {
  472. __int64 pos = d->getLPosition();
  473. char c = 0;
  474. bool kommentar = 0;
  475. bool slash = 0;
  476. bool gefunden = 0;
  477. while( !d->istEnde() )
  478. {
  479. d->lese( &c, 1 );
  480. if( c == '\n' )
  481. {
  482. zeile++;
  483. kommentar = 0;
  484. continue;
  485. }
  486. if( c == '#' )
  487. {
  488. kommentar = 1;
  489. continue;
  490. }
  491. if( c == '/' )
  492. {
  493. if( slash )
  494. {
  495. kommentar = 1;
  496. slash = 0;
  497. }
  498. else
  499. slash = 1;
  500. continue;
  501. }
  502. else
  503. slash = 0;
  504. if( !istLehr( c ) && !kommentar )
  505. {
  506. gefunden = 1;
  507. break;
  508. }
  509. }
  510. if( d->istEnde() && !gefunden )
  511. {
  512. d->setLPosition( pos, 0 );
  513. return 0;
  514. }
  515. d->setLPosition( d->getLPosition() - 1, 0 );
  516. return 1;
  517. }
  518. int KSGSLeser::leseNext()
  519. {
  520. if( !leseBisText() )
  521. return -1;
  522. __int64 pos = d->getLPosition();
  523. int ret = 0;
  524. Text txt = "";
  525. char byte[] = { 0, 0 };
  526. d->lese( byte, 1 );
  527. while( !istTrenner( byte[ 0 ] ) && !d->istEnde() )
  528. {
  529. txt.append( byte );
  530. d->lese( byte, 1 );
  531. }
  532. if( d->istEnde() || !txt.getLength() )
  533. {
  534. d->setLPosition( pos, 0 );
  535. return -1;
  536. }
  537. if( txt.istGleich( "class" ) )
  538. ret = 1;
  539. if( txt.istGleich( "func" ) )
  540. ret = 2;
  541. if( txt.istGleich( "var" ) )
  542. ret = 3;
  543. if( txt.istGleich( "public" ) )
  544. ret = 4;
  545. if( txt.istGleich( "private" ) )
  546. ret = 5;
  547. if( txt.istGleich( "if" ) )
  548. ret = 6;
  549. if( txt.istGleich( "for" ) )
  550. ret = 7;
  551. if( txt.istGleich( "while" ) )
  552. ret = 8;
  553. if( txt.istGleich( "return" ) )
  554. ret = 9;
  555. if( txt.istGleich( "break" ) )
  556. ret = 10;
  557. if( txt.istGleich( "continue" ) )
  558. ret = 11;
  559. if( txt.istGleich( "lesen" ) )
  560. ret = 12;
  561. d->setLPosition( pos, 0 );
  562. return ret;
  563. }
  564. bool KSGSLeser::istTrenner( char c )
  565. {
  566. return !( ( c >= 'a' && c <= 'z' ) || ( c >= 'A' && c <= 'Z' ) || ( c >= '0' && c <= '9' )
  567. || c == '_' || c == 'ä' || c == 'ö' || c == 'ü' || c == 'Ä' || c == 'Ö' || c == 'Ü' || c == 'ß' );
  568. }
  569. bool KSGSLeser::istLehr( char c )
  570. {
  571. return c == ' ' || c == '\n' || c == '\r' || c == '\t';
  572. }
  573. KSGSLeseKlasse *KSGSLeser::leseKlasse()
  574. {
  575. KSGSLeseKlasse *ret = new KSGSLeseKlasse();
  576. ret->debug.datei.setText( *pfad );
  577. ret->debug.zeile = zeile;
  578. d->setLPosition( d->getLPosition() + 5, 0 ); // 'class' überspringen
  579. if( !leseBisText() ) // Bis zum beginn des Klassennamens lesen
  580. {
  581. delete ret;
  582. return 0;
  583. }
  584. char byte[] = { 0, 0 }; // Klassenname lesen
  585. d->lese( byte, 1 );
  586. while( !istTrenner( *byte ) )
  587. {
  588. ret->name.append( byte );
  589. d->lese( byte, 1 );
  590. }
  591. if( !leseBis( '{' ) ) // Bis zum beginn der Klasse lesen
  592. {
  593. delete ret;
  594. return 0;
  595. }
  596. d->setLPosition( d->getLPosition() + 1, 0 );
  597. bool sichtbar = 0;
  598. __int64 ende = nextPosOf( '}', '{' ); // Ende der Klasse
  599. if( ende < 0 )
  600. {
  601. delete ret;
  602. return 0;
  603. }
  604. while( d->getLPosition() < ende ) // Inhalt der Klasse lesen
  605. {
  606. int id = leseNext();
  607. if( id == -1 )
  608. break;
  609. switch( id )
  610. {
  611. case 2: // Funktion
  612. if( 1 )
  613. {
  614. KSGSLeseFunktion *f = leseFunktion();
  615. if( !f )
  616. {
  617. delete ret;
  618. return 0;
  619. }
  620. ret->funktionen.add( f );
  621. ret->fSichtbar.add( sichtbar );
  622. }
  623. break;
  624. case 3: // Variable
  625. if( 1 )
  626. {
  627. KSGSLeseVariable *v = leseVariable();
  628. if( !v )
  629. {
  630. delete ret;
  631. return 0;
  632. }
  633. ret->variablen.add( v );
  634. ret->vSichtbar.add( sichtbar );
  635. }
  636. break;
  637. case 4: // public
  638. sichtbar = 1;
  639. d->setLPosition( d->getLPosition() + 6, 0 );
  640. if( !leseBis( ':' ) )
  641. {
  642. delete ret;
  643. return 0;
  644. }
  645. d->setLPosition( d->getLPosition() + 1, 0 );
  646. break;
  647. case 5: // private
  648. sichtbar = 0;
  649. d->setLPosition( d->getLPosition() + 7, 0 );
  650. if( !leseBis( ':' ) )
  651. {
  652. delete ret;
  653. return 0;
  654. }
  655. d->setLPosition( d->getLPosition() + 1, 0 );
  656. break;
  657. default:
  658. delete ret;
  659. return 0;
  660. }
  661. }
  662. if( d->getLPosition() > ende )
  663. {
  664. delete ret;
  665. return 0;
  666. }
  667. d->setLPosition( ende + 1, 0 );
  668. if( !leseBis( ';' ) ) // ';' Nach einer Klasse überlesen
  669. {
  670. delete ret;
  671. return 0;
  672. }
  673. d->setLPosition( d->getLPosition() + 1, 0 );
  674. return ret;
  675. }
  676. KSGSLeseFunktion *KSGSLeser::leseFunktion()
  677. {
  678. KSGSLeseFunktion *ret = new KSGSLeseFunktion();
  679. ret->debug.datei.setText( *pfad );
  680. ret->debug.zeile = zeile;
  681. d->setLPosition( d->getLPosition() + 4, 0 ); // 'func' überspringen
  682. if( !leseBisText() )
  683. {
  684. delete ret;
  685. return 0;
  686. }
  687. char byte[] = { 0, 0 }; // Rückgabetyp der Funktion lesen
  688. d->lese( byte, 1 );
  689. while( !istTrenner( *byte ) )
  690. {
  691. ret->typ.append( byte );
  692. d->lese( byte, 1 );
  693. }
  694. d->setLPosition( d->getLPosition() - 1, 0 );
  695. if( !leseBisText() )
  696. {
  697. delete ret;
  698. return 0;
  699. }
  700. d->lese( byte, 1 ); // Name der Funktion lesen
  701. while( !istTrenner( *byte ) )
  702. {
  703. ret->name.append( byte );
  704. d->lese( byte, 1 );
  705. }
  706. d->setLPosition( d->getLPosition() - 1, 0 );
  707. if( !leseBis( '(' ) ) // Parameterbeginn
  708. {
  709. delete ret;
  710. return 0;
  711. }
  712. d->setLPosition( d->getLPosition() + 1, 0 );
  713. __int64 paramEnde = nextPosOf( ')', '(' );
  714. while( d->getLPosition() < paramEnde )
  715. {
  716. KSGSLeseVariable *param = leseVariable( 1 ); // Übergabeparameter einlesen
  717. if( !param )
  718. break;
  719. ret->parameter.add( param );
  720. }
  721. d->setLPosition( paramEnde + 1, 0 );
  722. if( !leseBis( '{' ) ) // Funktionsrumpf beginn
  723. {
  724. delete ret;
  725. return 0;
  726. }
  727. d->setLPosition( d->getLPosition() + 1, 0 );
  728. __int64 funkEnde = nextPosOf( '}', '{' ); // Ende der Funktion
  729. while( d->getLPosition() < funkEnde )
  730. {
  731. KSGSLeseBefehl *bef = leseBefehl(); // Befehle einlesen
  732. if( !bef )
  733. break;
  734. else
  735. ret->befehle.add( bef );
  736. if( !leseBisText() )
  737. {
  738. delete ret;
  739. return 0;
  740. }
  741. }
  742. d->setLPosition( funkEnde + 1, 0 ); // '}' am ende der Funktion überlesen
  743. return ret;
  744. }
  745. KSGSLeseVariable *KSGSLeser::leseVariable( bool param )
  746. {
  747. KSGSLeseVariable *ret = new KSGSLeseVariable();
  748. ret->debug.datei.setText( *pfad );
  749. ret->debug.zeile = zeile;
  750. if( !param )
  751. d->setLPosition( d->getLPosition() + 3, 0 ); // 'var' überspringen
  752. __int64 endPos = 0;
  753. if( param )
  754. endPos = nextPosOf( ')', 0 );
  755. if( !leseBisText() )
  756. {
  757. delete ret;
  758. return 0;
  759. }
  760. if( param && d->getLPosition() >= endPos )
  761. {
  762. delete ret;
  763. return 0;
  764. }
  765. char byte[] = { 0, 0 }; // Variablentyp lesen
  766. d->lese( byte, 1 );
  767. while( !istTrenner( *byte ) )
  768. {
  769. ret->typ.append( byte );
  770. d->lese( byte, 1 );
  771. }
  772. d->setLPosition( d->getLPosition() - 1, 0 );
  773. if( !leseBisText() )
  774. {
  775. delete ret;
  776. return 0;
  777. }
  778. d->lese( byte, 1 ); // Variablenname lesen
  779. while( !istTrenner( *byte ) )
  780. {
  781. ret->name.append( byte );
  782. d->lese( byte, 1 );
  783. }
  784. d->setLPosition( d->getLPosition() - 1, 0 );
  785. __int64 ende = nextPosOf( ';', 0 );
  786. if( param )
  787. {
  788. __int64 tmp = nextPosOf( ',', 0 );
  789. if( tmp >= 0 && tmp < endPos )
  790. ende = tmp;
  791. else
  792. ende = endPos;
  793. }
  794. __int64 gleich = nextPosOf( '=', 0 );
  795. if( gleich < ende && gleich >= 0 ) // prüfen ob die variable gesetzt wird
  796. {
  797. if( !leseBis( '=' ) )
  798. {
  799. delete ret;
  800. return 0;
  801. }
  802. d->setLPosition( d->getLPosition() + 1, 0 );
  803. }
  804. if( leseBisText() )
  805. {
  806. if( d->getLPosition() < ende )
  807. {
  808. while( d->getLPosition() < ende ) // Wert der Variable lesen
  809. {
  810. d->lese( byte, 1 );
  811. ret->wert.append( byte );
  812. }
  813. }
  814. }
  815. while( istLehr( ret->wert.getText()[ ret->wert.getLength() - 1 ] ) && ret->wert.getLength() > 0 )
  816. {
  817. if( ret->wert.getText()[ ret->wert.getLength() - 1 ] == '\n' )
  818. zeile++;
  819. if( !( ret->wert.getLength() - 1 ) )
  820. {
  821. ret->wert.setText( "" );
  822. break;
  823. }
  824. ret->wert.setText( ret->wert.getText(), ret->wert.getLength() - 1 );
  825. }
  826. if( d->getLPosition() > ende )
  827. {
  828. delete ret;
  829. return 0;
  830. }
  831. d->setLPosition( ende + 1, 0 ); // ';' oder bei param ')' oder ',' am Ende überlesen
  832. return ret;
  833. }
  834. KSGSLeseBefehl *KSGSLeser::leseBefehl()
  835. {
  836. __int64 fEnde = nextPosOf( '}', '{' );
  837. if( fEnde < 0 )
  838. return 0;
  839. int typ = leseNext();
  840. if( typ < 0 )
  841. return 0;
  842. KSGSLeseBefehl *ret = new KSGSLeseBefehl();
  843. ret->debug.datei.setText( *pfad );
  844. ret->debug.zeile = zeile;
  845. ret->typ = typ;
  846. switch( typ )
  847. {
  848. case 0:
  849. case 3: // var
  850. if( 1 )
  851. {
  852. __int64 endPos = nextPosOf( ';', 0 );
  853. if( endPos < 0 )
  854. {
  855. delete ret;
  856. return 0;
  857. }
  858. int län = (int)( endPos - d->getLPosition() );
  859. if( län )
  860. {
  861. char *txt = new char[ län + 1 ];
  862. txt[ län ] = 0;
  863. d->lese( txt, län );
  864. ret->befehl = txt;
  865. delete[] txt;
  866. }
  867. d->setLPosition( endPos + 1, 0 );
  868. }
  869. break;
  870. case 6: // if
  871. if( 1 )
  872. {
  873. if( !leseBis( '(' ) )
  874. {
  875. delete ret;
  876. return 0;
  877. }
  878. d->setLPosition( d->getLPosition() + 1, 0 );
  879. __int64 endPos = nextPosOf( ')', '(' );
  880. if( endPos < 0 )
  881. {
  882. delete ret;
  883. return 0;
  884. }
  885. int län = (int)( endPos - d->getLPosition() );
  886. if( län )
  887. {
  888. char *txt = new char[ län + 1 ];
  889. txt[ län ] = 0;
  890. d->lese( txt, län );
  891. ret->befehl = txt;
  892. delete[] txt;
  893. }
  894. d->setLPosition( endPos + 1, 0 );
  895. if( !leseBis( '{' ) )
  896. {
  897. delete ret;
  898. return 0;
  899. }
  900. d->setLPosition( d->getLPosition() + 1, 0 );
  901. endPos = nextPosOf( '}', '{' );
  902. if( endPos < 0 )
  903. {
  904. delete ret;
  905. return 0;
  906. }
  907. while( d->getLPosition() < endPos )
  908. {
  909. KSGSLeseBefehl *tmp = leseBefehl();
  910. if( !tmp )
  911. break;
  912. else
  913. ret->listA.add( tmp );
  914. }
  915. d->setLPosition( endPos + 1, 0 );
  916. int tmpZ = zeile;
  917. if( !leseBisText() )
  918. {
  919. delete ret;
  920. return 0;
  921. }
  922. char *el = new char[ 5 ];
  923. if( d->getLPosition() + 4 <= fEnde )
  924. d->lese( el, 4 );
  925. else
  926. el[ 0 ] = 0;
  927. el[ 4 ] = 0;
  928. if( Text( "else" ).istGleich( el ) )
  929. {
  930. if( !leseBis( '{' ) )
  931. {
  932. delete ret;
  933. return 0;
  934. }
  935. d->setLPosition( d->getLPosition() + 1, 0 );
  936. endPos = nextPosOf( '}', '{' );
  937. if( endPos < 0 )
  938. {
  939. delete ret;
  940. return 0;
  941. }
  942. while( d->getLPosition() < endPos )
  943. {
  944. KSGSLeseBefehl *tmp = leseBefehl();
  945. if( !tmp )
  946. break;
  947. else
  948. ret->listB.add( tmp );
  949. }
  950. d->setLPosition( endPos + 1, 0 );
  951. }
  952. else
  953. {
  954. d->setLPosition( endPos + 1, 0 );
  955. zeile = tmpZ;
  956. }
  957. delete[] el;
  958. }
  959. break;
  960. case 7: // for
  961. case 8: // while
  962. if( 1 )
  963. {
  964. if( !leseBis( '(' ) )
  965. {
  966. delete ret;
  967. return 0;
  968. }
  969. d->setLPosition( d->getLPosition() + 1, 0 );
  970. __int64 endPos = nextPosOf( ')', '(' );
  971. if( endPos < 0 )
  972. {
  973. delete ret;
  974. return 0;
  975. }
  976. int län = (int)( endPos - d->getLPosition() );
  977. if( län )
  978. {
  979. char *txt = new char[ län + 1 ];
  980. txt[ län ] = 0;
  981. d->lese( txt, län );
  982. ret->befehl = txt;
  983. delete[] txt;
  984. }
  985. d->setLPosition( endPos + 1, 0 );
  986. if( !leseBis( '{' ) )
  987. {
  988. delete ret;
  989. return 0;
  990. }
  991. d->setLPosition( d->getLPosition() + 1, 0 );
  992. endPos = nextPosOf( '}', '{' );
  993. if( endPos < 0 )
  994. {
  995. delete ret;
  996. return 0;
  997. }
  998. while( d->getLPosition() < endPos )
  999. {
  1000. KSGSLeseBefehl *tmp = leseBefehl();
  1001. if( !tmp )
  1002. break;
  1003. else
  1004. ret->listA.add( tmp );
  1005. }
  1006. d->setLPosition( endPos + 1, 0 );
  1007. }
  1008. break;
  1009. case 9: // return
  1010. if( 1 )
  1011. {
  1012. __int64 endPos = nextPosOf( ';', 0 );
  1013. if( endPos < 0 )
  1014. {
  1015. delete ret;
  1016. return 0;
  1017. }
  1018. int län = (int)( endPos - d->getLPosition() );
  1019. if( län )
  1020. {
  1021. char *txt = new char[ län + 1 ];
  1022. txt[ län ] = 0;
  1023. d->lese( txt, län );
  1024. ret->befehl = txt;
  1025. delete[] txt;
  1026. }
  1027. d->setLPosition( endPos + 1, 0 );
  1028. }
  1029. break;
  1030. case 10: // break
  1031. case 11: // continue
  1032. if( 1 )
  1033. {
  1034. __int64 endPos = nextPosOf( ';', 0 );
  1035. if( endPos < 0 )
  1036. {
  1037. delete ret;
  1038. return 0;
  1039. }
  1040. d->setLPosition( endPos + 1, 0 );
  1041. }
  1042. break;
  1043. }
  1044. if( d->getLPosition() > fEnde )
  1045. {
  1046. delete ret;
  1047. return 0;
  1048. }
  1049. ret->befehl.ersetzen( "->", "." );
  1050. return ret;
  1051. }
  1052. // Script Compilieren
  1053. bool KSGSLeser::compileKlasse( KSGSLeseKlasse *zLK, KSGSCompKlassTable *zKT )
  1054. {
  1055. if( !zKT->hat( (char*)zLK->name ) )
  1056. {
  1057. error( 10, {}, zObj );
  1058. return 0;
  1059. }
  1060. KSGSCompileKlasse *k = zKT->get( (char*)zLK->name );
  1061. int lFAnz = zLK->funktionen.getEintragAnzahl();
  1062. for( int i = 0; i < lFAnz; i++ )
  1063. {
  1064. if( !compileFunktion( zLK->funktionen.get( i ), zKT, &k->funcs, 1 + !zLK->fSichtbar.get( i ) ) )
  1065. return 0;
  1066. }
  1067. k->vars.addVariable( "this", new KSGSCompileVariable( k->id, 2 ) );
  1068. int lVAnz = zLK->variablen.getEintragAnzahl();
  1069. for( int i = 0; i < lVAnz; i++ )
  1070. {
  1071. auto tmp = zKT->get( (char*)zLK->variablen.get( i )->typ );
  1072. if( !tmp )
  1073. {
  1074. error( 11, { zLK->debug.datei, Text() += zLK->debug.zeile, (char*)zLK->variablen.get( i )->typ, (char*)zLK->variablen.get( i )->name }, zObj );
  1075. return 0;
  1076. }
  1077. if( !k->vars.addVariable( zLK->variablen.get( i )->name, new KSGSCompileVariable( tmp->id, 1 + !zLK->vSichtbar.get( i ) ) ) )
  1078. {
  1079. error( 9, { zLK->variablen.get( i )->debug.datei, Text() += zLK->variablen.get( i )->debug.zeile, zLK->variablen.get( i )->name }, zObj );
  1080. return 0;
  1081. }
  1082. }
  1083. return 1;
  1084. }
  1085. bool KSGSLeser::compileFunktion( KSGSLeseFunktion *zLF, KSGSCompKlassTable *zKT, KSGSCompFuncTable *zFT, int s )
  1086. {
  1087. KSGSCompileFunktion *f = new KSGSCompileFunktion( zKT->get( (char*)zLF->typ )->id, s, {} );
  1088. int anz = zLF->parameter.getEintragAnzahl();
  1089. for( int j = 0; j < anz; j++ )
  1090. {
  1091. auto tmp = zKT->get( (char*)zLF->parameter.get( j )->typ );
  1092. if( tmp )
  1093. f->parameterTyp.add( tmp->id );
  1094. else
  1095. {
  1096. error( 11, { zLF->debug.datei, Text() += zLF->debug.zeile, zLF->parameter.get( j )->typ, zLF->parameter.get( j )->name }, zObj );
  1097. return 0;
  1098. }
  1099. }
  1100. if( !zFT->addFunktion( zLF->name, f ) )
  1101. {
  1102. error( 8, { zLF->debug.datei, Text() += zLF->debug.zeile, zLF->name }, zObj );
  1103. return 0;
  1104. }
  1105. return 1;
  1106. }
  1107. KSGSVariableDef *KSGSLeser::compileVariable( KSGSLeseVariable *zLV, KSGSCompKlassTable *zKT, int id )
  1108. {
  1109. if( !zKT->hat( (char*)zLV->typ ) )
  1110. {
  1111. error( 11, { zLV->debug.datei, Text() += zLV->debug.zeile, zLV->typ, zLV->name }, zObj );
  1112. return 0;
  1113. }
  1114. KSGSVariableDef *ret = new KSGSVariableDef();
  1115. ret->id = id;
  1116. ret->sichtbar = 0;
  1117. ret->typId = zKT->get( (char*)zLV->typ )->id;
  1118. ret->wert.setText( zLV->wert );
  1119. return ret;
  1120. }
  1121. KSGSKlasse *KSGSLeser::buildKlasse( KSGSLeseKlasse *zLK, KSGSCompKlassTable *zKT, KSGSCompFuncTable *zFT, KSGSCompVarTable *zVT )
  1122. {
  1123. if( !zKT->hat( (char*)zLK->name ) )
  1124. {
  1125. error( 10, {}, zObj );
  1126. return 0;
  1127. }
  1128. KSGSKlasse *ret = new KSGSKlasse( zKT->get( (char*)zLK->name )->id );
  1129. int anz = zLK->funktionen.getEintragAnzahl();
  1130. for( int i = 0; i < anz; i++ )
  1131. {
  1132. KSGSFunktion *f = buildFunktion( zLK->funktionen.get( i ), zKT, zFT, zVT, zLK->name );
  1133. if( !f )
  1134. {
  1135. ret->release();
  1136. return 0;
  1137. }
  1138. ret->addFunktion( f );
  1139. }
  1140. anz = zLK->variablen.getEintragAnzahl();
  1141. for( int i = 0; i < anz; i++ )
  1142. {
  1143. KSGSVariableDef *v = compileVariable( zLK->variablen.get( i ), zKT, i );
  1144. if( !v )
  1145. {
  1146. ret->release();
  1147. return 0;
  1148. }
  1149. v->sichtbar = 1 + !zLK->vSichtbar.get( i );
  1150. ret->addVariable( v );
  1151. }
  1152. return ret;
  1153. }
  1154. KSGSFunktion *KSGSLeser::buildFunktion( KSGSLeseFunktion *zLF, KSGSCompKlassTable *zKT, KSGSCompFuncTable *zFT, KSGSCompVarTable *zVT, const char *klassName )
  1155. {
  1156. KSGSCompFuncTable *ft = zFT;
  1157. if( klassName )
  1158. ft = &zKT->get( klassName )->funcs;
  1159. if( !ft->hat( zLF->name ) )
  1160. {
  1161. error( 10, {}, zObj );
  1162. return 0;
  1163. }
  1164. KSGSFunktion *ret = new KSGSFunktion( ft->get( zLF->name )->id, ft->get( zLF->name )->sichtbar, zKT->get( (char*)zLF->typ )->id );
  1165. ret->setName( zLF->name );
  1166. int anz = zLF->parameter.getEintragAnzahl();
  1167. for( int i = 0; i < anz; i++ )
  1168. {
  1169. KSGSVariableDef *v = compileVariable( zLF->parameter.get( i ), zKT, i );
  1170. if( !v )
  1171. {
  1172. ret->release();
  1173. return 0;
  1174. }
  1175. v->sichtbar = 3;
  1176. ret->addParameter( v );
  1177. auto tmp = zKT->get( (char*)zLF->parameter.get( i )->typ );
  1178. if( !tmp )
  1179. {
  1180. error( 11, { zLF->debug.datei, Text() += zLF->debug.zeile, zLF->parameter.get( i )->typ, zLF->parameter.get( i )->name }, zObj );
  1181. return 0;
  1182. }
  1183. ft->get( zLF->name )->vars.addVariable( zLF->parameter.get( i )->name, new KSGSCompileVariable( tmp->id, 3 ) );
  1184. }
  1185. anz = zLF->befehle.getEintragAnzahl();
  1186. for( int i = 0; i < anz; i++ )
  1187. {
  1188. KSGSBefehl *b = buildBefehl( zLF->befehle.get( i ), zKT, zFT, zVT, klassName, zLF->name );
  1189. if( !b )
  1190. {
  1191. ret->release();
  1192. return 0;
  1193. }
  1194. ret->addBefehl( b );
  1195. }
  1196. return ret;
  1197. }
  1198. KSGSBefehl *KSGSLeser::buildBefehl( KSGSLeseBefehl *zLB, KSGSCompKlassTable *zKT, KSGSCompFuncTable *zFT, KSGSCompVarTable *zVT, const char *klassName, const char *funktionName )
  1199. {
  1200. KSGSBefehl *ret = 0;
  1201. zLB->befehl.setSuchGrenzen( '(', ')' );
  1202. removeKlammer( &zLB->befehl );
  1203. switch( zLB->typ )
  1204. {
  1205. case 0: // call oder operator
  1206. if( 1 )
  1207. {
  1208. if( hatOperator( &zLB->befehl ) >= 0 )
  1209. ret = new KSGSOperatorBefehl( zObj, zLB, zKT, zFT, zVT, klassName, funktionName );
  1210. else
  1211. ret = new KSGSCallBefehl( zObj, zLB, zKT, zFT, zVT, klassName, funktionName );
  1212. }
  1213. break;
  1214. case 3: // var
  1215. ret = new KSGSVariableBefehl( zObj, zLB, zKT, zFT, zVT, klassName, funktionName );
  1216. break;
  1217. case 6: // if
  1218. ret = new KSGSIfBefehl( zObj, zLB, zKT, zFT, zVT, klassName, funktionName );
  1219. break;
  1220. case 7: // for
  1221. ret = new KSGSForBefehl( zObj, zLB, zKT, zFT, zVT, klassName, funktionName );
  1222. break;
  1223. case 8: // while
  1224. ret = new KSGSWhileBefehl( zObj, zLB, zKT, zFT, zVT, klassName, funktionName );
  1225. break;
  1226. case 9: // return
  1227. ret = new KSGSReturnBefehl( zObj, zLB, zKT, zFT, zVT, klassName, funktionName );
  1228. break;
  1229. case 10: // break
  1230. ret = new KSGSBreakBefehl( zLB, zKT, zFT, zVT, klassName, funktionName );
  1231. break;
  1232. case 11: // continue
  1233. ret = new KSGSContinueBefehl( zLB, zKT, zFT, zVT, klassName, funktionName );
  1234. break;
  1235. }
  1236. if( !ret )
  1237. error( 13, { zLB->debug.datei, Text() += zLB->debug.zeile, zLB->befehl }, zObj );
  1238. if( ret && ret->hatFehler() )
  1239. ret = ret->release();
  1240. return ret;
  1241. }
  1242. // nicht constant
  1243. bool KSGSLeser::laden()
  1244. {
  1245. delete dat;
  1246. dat = new KSGSLeseScript();
  1247. bool ok = ladeDatei();
  1248. return ok;
  1249. }
  1250. bool KSGSLeser::compile( RCArray< KSGSKlasse > *klassen, RCArray< KSGSFunktion > *funktionen, Array< KSGSVariableDef* > *variablen )
  1251. {
  1252. // Klassen Tabelle
  1253. KSGSCompKlassTable *klassT = new KSGSCompKlassTable();
  1254. int kAnz = dat->klassen.getEintragAnzahl();
  1255. for( int i = 0; i < kAnz; i++ )
  1256. {
  1257. if( !klassT->addKlasse( dat->klassen.get( i )->name, new KSGSCompileKlasse() ) )
  1258. {
  1259. error( 7, { dat->klassen.get( i )->debug.datei, Text() += dat->klassen.get( i )->debug.zeile, dat->klassen.get( i )->name }, zObj );
  1260. klassT->release();
  1261. return 0;
  1262. }
  1263. }
  1264. // Funktions Tabelle
  1265. KSGSCompFuncTable *funcT = new KSGSCompFuncTable();
  1266. funcT->addFunktion( "Rückruf", new KSGSCompileFunktion( KSGS_VOID, 0, {} ) );
  1267. int fAnz = dat->funktionen.getEintragAnzahl();
  1268. for( int i = 0; i < fAnz; i++ )
  1269. {
  1270. if( !compileFunktion( dat->funktionen.get( i ), klassT, funcT ) )
  1271. {
  1272. error( 8, { dat->funktionen.get( i )->debug.datei, Text() += dat->funktionen.get( i )->debug.zeile, dat->funktionen.get( i )->name }, zObj );
  1273. klassT->release();
  1274. funcT->release();
  1275. return 0;
  1276. }
  1277. if( dat->funktionen.get( i )->name.istGleich( "start" ) )
  1278. mainFuncId = funcT->get( "start" )->id;
  1279. if( dat->funktionen.get( i )->name.istGleich( "maus" ) )
  1280. mausFuncId = funcT->get( "maus" )->id;
  1281. if( dat->funktionen.get( i )->name.istGleich( "tastatur" ) )
  1282. tastaturFuncId = funcT->get( "tastatur" )->id;
  1283. if( dat->funktionen.get( i )->name.istGleich( "tick" ) )
  1284. tickFuncId = funcT->get( "tick" )->id;
  1285. if( dat->funktionen.get( i )->name.istGleich( "render" ) )
  1286. renderFuncId = funcT->get( "render" )->id;
  1287. }
  1288. // Variablen Tabelle
  1289. KSGSCompVarTable *varT = new KSGSCompVarTable();
  1290. int vAnz = dat->variablen.getEintragAnzahl();
  1291. for( int i = 0; i < vAnz; i++ )
  1292. {
  1293. auto tmp = klassT->get( (char*)dat->variablen.get( i )->typ );
  1294. if( !tmp )
  1295. {
  1296. error( 11, { dat->variablen.get( i )->debug.datei, Text() += dat->variablen.get( i )->debug.zeile, dat->variablen.get( i )->typ, dat->variablen.get( i )->name }, zObj );
  1297. return 0;
  1298. }
  1299. if( !varT->addVariable( dat->variablen.get( i )->name, new KSGSCompileVariable( klassT->get( (char*)dat->variablen.get( i )->typ )->id, 0 ) ) )
  1300. {
  1301. error( 9, { dat->variablen.get( i )->debug.datei, Text() += dat->variablen.get( i )->debug.zeile, dat->variablen.get( i )->name }, zObj );
  1302. klassT->release();
  1303. funcT->release();
  1304. varT->release();
  1305. return 0;
  1306. }
  1307. }
  1308. for( int i = 0; i < kAnz; i++ )
  1309. {
  1310. if( !compileKlasse( dat->klassen.get( i ), klassT ) )
  1311. {
  1312. klassT->release();
  1313. funcT->release();
  1314. varT->release();
  1315. return 0;
  1316. }
  1317. }
  1318. for( int i = 0; i < vAnz; i++ )
  1319. {
  1320. KSGSVariableDef *k = compileVariable( dat->variablen.get( i ), klassT, i );
  1321. if( !k )
  1322. {
  1323. int anz = variablen->getEintragAnzahl();
  1324. for( int i = 0; i < anz; i++ )
  1325. delete variablen->get( i );
  1326. variablen->leeren();
  1327. klassT->release();
  1328. funcT->release();
  1329. varT->release();
  1330. return 0;
  1331. }
  1332. variablen->add( k );
  1333. }
  1334. for( int i = 0; i < kAnz; i++ )
  1335. {
  1336. KSGSKlasse *k = buildKlasse( dat->klassen.get( i ), klassT, funcT, varT );
  1337. if( !k )
  1338. {
  1339. klassen->leeren();
  1340. variablen->leeren();
  1341. klassT->release();
  1342. funcT->release();
  1343. varT->release();
  1344. return 0;
  1345. }
  1346. klassen->add( k );
  1347. }
  1348. funktionen->add( new KSGSRückrufFunktion() );
  1349. for( int i = 0; i < fAnz; i++ )
  1350. {
  1351. KSGSFunktion *f = buildFunktion( dat->funktionen.get( i ), klassT, funcT, varT );
  1352. if( !f )
  1353. {
  1354. klassen->leeren();
  1355. funktionen->leeren();
  1356. variablen->leeren();
  1357. klassT->release();
  1358. funcT->release();
  1359. varT->release();
  1360. return 0;
  1361. }
  1362. funktionen->add( f );
  1363. }
  1364. klassT->release();
  1365. funcT->release();
  1366. varT->release();
  1367. return 1;
  1368. }
  1369. // constant
  1370. int KSGSLeser::getMainFuncId() const
  1371. {
  1372. return mainFuncId;
  1373. }
  1374. int KSGSLeser::getMausFuncId() const
  1375. {
  1376. return mausFuncId;
  1377. }
  1378. int KSGSLeser::getTastaturFuncId() const
  1379. {
  1380. return tastaturFuncId;
  1381. }
  1382. int KSGSLeser::getTickFuncId() const
  1383. {
  1384. return tickFuncId;
  1385. }
  1386. int KSGSLeser::getRenderFuncId() const
  1387. {
  1388. return renderFuncId;
  1389. }
  1390. // Reference Counting
  1391. KSGSLeser *KSGSLeser::getThis()
  1392. {
  1393. ref++;
  1394. return this;
  1395. }
  1396. KSGSLeser *KSGSLeser::release()
  1397. {
  1398. ref--;
  1399. if( !ref )
  1400. delete this;
  1401. return 0;
  1402. }