<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">
package l6;

import java.util.Scanner;

public class Parser {
    
    private static boolean czyLiczbowy(char zn) {
        return (zn &gt;= '0' &amp;&amp; zn &lt;= '9') || zn == '.';
    }
    
    private static void pominSpacje(String str, int[] poz) {
        while (true) {
            if (poz[0] &gt;= str.length())
                break;
            if (str.charAt(poz[0]) != ' ')
                break;
            poz[0]++;
        }        
    }
    
    private static double parsujLiczbe(String str, int[] poz) {
        int p = poz[0];
        while (true) {
            p++;
            if (p &gt;= str.length())
                break;
            if (!czyLiczbowy(str.charAt(p)))
                break;
        }
        String sub = str.substring(poz[0], p);
        poz[0] = p;
        return Double.valueOf(sub);        
    }
    
    private static WyraĹźenie parsujOd(String str, int[] poz) throws ZleWejscie {
        pominSpacje(str, poz);
        if (poz[0] &gt;= str.length())
            throw new ZleWejscie();
        char zn = str.charAt(poz[0]);
        if (czyLiczbowy(zn))
            return new StaĹa(parsujLiczbe(str, poz));
        poz[0]++;
        switch (zn) {
            case 'x':   return new Zmienna();
            case '+':   return new Dodawanie(parsujOd(str, poz), parsujOd(str, poz));
            case '-':   return new Odejmowanie(parsujOd(str, poz), parsujOd(str, poz));
            case '*':   return new MnoĹźenie(parsujOd(str, poz), parsujOd(str, poz));
            case '/':   return new Dzielenie(parsujOd(str, poz), parsujOd(str, poz));
            case 's':   return new Sinus(parsujOd(str, poz));
            case 'c':   return new Cosinus(parsujOd(str, poz));
            case 'l':   return new LogNat(parsujOd(str, poz));
            case '\'':  return parsujOd(str, poz).pochodna();
            case 'S':   double odkad = parsujLiczbe(str, poz);
                        double dokad = parsujLiczbe(str, poz);
                        return new StaĹa(parsujOd(str, poz).calka(odkad, dokad));
            case 'W':   double wart = parsujLiczbe(str, poz);
                        return new StaĹa(parsujOd(str, poz).wartoĹÄ(wart));
        }
        throw new ZleWejscie();
    }
    
    public static WyraĹźenie parsuj(String str) {
        int[] poz = new int[1];
        poz[0] = 0;
        try {
            return parsujOd(str, poz);
        } catch (ZleWejscie e) {
            return null;
        }
    }
    
    public static void dzialaj() {
        Scanner sc = new Scanner(System.in);
        String line;
        do {
            line = sc.nextLine();
            if (line.equals("")) {
                System.out.println("Puste polecenie - koniec");
                break;
            }
            WyraĹźenie w = parsuj(line);
            if (w == null) {
                System.out.println("BĹÄdne polecenie - koniec");
                break;
            } else
                System.out.println(w);
        } while (!line.equals(""));
        sc.close();
    }

    private static class ZleWejscie extends Exception {

        public ZleWejscie() {
        }
        
    }
    
}
</pre></body></html>