Prílohy:1

Parser

Vytvorte parser, ktorý na vstupe rozpozná nasledujúce tokeny:

  • identifikátor (reťazec znakov a číslic)
  • konštanta (reťazec číslic)
  • priradenie (znak =)
  • sčítanie (znak +)
  • odčítanie (znak -)
  • násobenie (znak *)
  • delenie (znak /)
  • bodkočiarka (znak ;)
  • ľavázátvorka (znak ()
  • pravá zátvorka (znak ))
  • kľúčovéslovo (reťazce "vstup", "vystup")
  • koniecvstupu

Parser je potrebné implementovať ako triedu, ktorá bude v konštruktore očakávať odkaz na vstupné dáta, a bude obsahovať metódu Token dalsi(), ktora pri každom zavolaní vráti ďaľší token rozpoznaný na vstupe.

Hlavna.java

package parser;

import java.io.IOException;

public class Hlavna {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws IOException {
        Parser p = new Parser("prem = (+31);");
        Token token;
        while ((token=p.dalsi())!=Token.EOF) System.out.println(token); 
    }
    
}

Parser.java

package parser;

import java.io.IOException;
import java.io.PushbackReader;
import java.io.StringReader;

public class Parser {
  
    int c;
    StringReader sr;
    PushbackReader pbr;

    public Parser(String vstup) {
        sr = new StringReader(vstup);
        pbr = new PushbackReader(sr); 
    }   
    
    public Token dalsi() throws IOException { 
        
        //identifikator, konstanta, priradenie, scitanie, 
        //odcitanie, lzatvorka, pzatvorka, klucove_slovo, EOF 
        
        String str="";
        int cislo;
        
        for(;;)
        {
            c = pbr.read();
            
            if (c==-1) return Token.EOF;
            if (c==' ') continue;
            
            if (c=='+') return Token.scitanie;
            if (c=='-') return Token.odcitanie;
            if (c=='(') return Token.lzatvorka;
            if (c==')') return Token.pzatvorka;
            if (c=='=') return Token.priradenie;
            if (c=='*') return Token.nasobenie;
            if (c=='/') return Token.delenie;
            if (c==';') return Token.bodkociarka;
            
            str += (char)c;
            c = pbr.read(); pbr.unread(c);
            
            if (!Character.isAlphabetic(c) && !Character.isDigit(c))
            {      
                //klucove_slovo
                if ("vystup".equals(str) || "vstup".equals(str)) return Token.klucove_slovo;
                
                //konstanta
                try {                        
                    cislo = Integer.parseInt(str);
                    return Token.konstanta;
                } catch (NumberFormatException e) {}
                
                //identifikator
                if (Character.isAlphabetic(str.charAt(0))) {
                    return Token.identifikator;
                } else {
                    System.out.println("ERROR: Chybne zapisana premenna." + str);
                    return Token.EOF;
                }
            }
            
            
        }
    }   
}

Token.java

package parser;

public enum Token {
    identifikator, konstanta, priradenie, scitanie, nasobenie, delenie, bodkociarka,
    odcitanie, lzatvorka, pzatvorka, klucove_slovo, EOF    
}