KSGSLeser.cpp 43 KB

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