KSGSLeser.cpp 41 KB

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