// Tento soubor obsahuje pseudokód víceméně podobný kódu jazyků vycházejících z jazyka C (včetně Javy). // Je to úsek ukazující, jak by měla vypadat funkce lexikální analýzy. // Samotný kód berte s rezervou, je maximálně ořezaný a zobecněný. enum TTypSymbolu..... class TSymbol.... TSymbol sym; // Následující si dejte třeba do struktury/třídy/objektu TSymbol, v každém případě si "někde" evidujte: // právě načtený znak: char zn; // číslo řádku: int cisloRad; // atd. // Funkce, která načte jeden znak ze vstupu, zajistí správný přechod na nový řádek apod. Vrací načtený znak. // Tvar a návratovou hodnotu upravte podle svého. char NactiZnak(); {...} // Funkce, která zajistí přesun na následující řádek na vstupu // (záleží, jak máte práci se vstupem, pokud je to jeden příkaz, není nutná funkce). // Může vracet třeba první znak na vstupu, případně #0=EOF při konci vstupu. char Zaradkuj(); // Funkce pro lexikální analýzu - předpokládá, že jeden znak ze vstupu je přednačtený. Symbol Lex() { TSymbol sym; while (true) { if (isWhitespace(zn)) zn=NactiZnak(); else if (KomentarovyZnak(zn)) // dosaďte si vlastní komentářový znak pro komentáře do konce řádku Zaradkuj(); else break; } if (zn=EOF) { // upravte dle svého, jak máte reprezentován konec vstupního souboru sym.typ=S_EOF; // upravte dle svého, symbol konce vstupu, $ return sym; } // písmeno => proměnná nebo klíčové slovo if ((zn >= 'a')&&(zn<='z')) { // předpokládejme, že jsou všechna písmena konvertovaná na malá; jinak otestovat i velká písmena sym.typ=S_ID; // načítejte postupně vstup, můžete zde rovnou nasměrovat do funkce, která bude rozlišovat klíčová slova od proměnných ... } // číslice => číslo else if (isDigit(zn)) { int nula= (int)'0'; sym.typ=S_NUM; sym.n= (int)zn-nula; // podle toho, jak máte reprezentován symbol zn=NactiZnak(); while (isDigit(zn)) { sym.n*=10; sym.n+=(int)zn-nula; zn=NactiZnak(); } if (zn='.') { // pokud si nevystačíme s celými čísly a chceme i desetinnou část double pom=1; sym.f=0; zn=NactiZnak(); while (isDigit(zn)) { pom/=10; sym.f+=((int)zn-nula)*pom; zn=NactiZnak(); } sym.typ=S_FLOAT; sym.f+=sym.n; } else sym.typ=S_INT; if ((zn>='a')&&(zn<='z')) ... // hlásit chybu } // ani písmeno, ani číslo... else swich (zn) { case '+': sym.typ=S_PLUS; zn=NactiZnak(); break; ... case '<': zn=NactiZnak(); if (zn='=') { sym.typ=S_LQ; // menší nebo rovno <= zn=NactiZnak(); } else sym.typ=S_LESS; break; ... default: // hlášení chyby } return sym; }