/media/sda-magnetic/david/Dok-15-2023-11-27/fernuni-hagen/cs-i-ii/old-cs-2-03/java-new/Arithmetic29/Arithmetic.java


public class Arithmetic {

     String [] SourceCodes = new String[10]; 
     String SourceCode;
   
   Arithmetic (String [] argv) {
        int i;
        try {
            Prog prg = new Prog (argv[0]);
        }
        catch (ArrayIndexOutOfBoundsException e) {
            System.out.println ("You must give at least one argument");
        }

   }
   

   
    public  class Prog {
    
        Prog (String SourceCode1) {
            SourceCode = SourceCode1;
            NotTerminal nt = new NotTerminal();
        
            printtree(nt.squnce());
        }
    
    }
    
    
    void printtree (NotTerminal t) {
        if (t != null) {
            System.out.print ("<ul>");
            if (t.Terminal1 != null) {
                System.out.print (t.Terminal1); 
            }
            if (t.Terminal2 != null) {
                System.out.print (t.Terminal2); 
            }
            if (t.Terminal3 != null) {
                System.out.print (t.Terminal3); 
            }
            if (t.Terminal4 != null) {
                System.out.print (t.Terminal4); 
            }
            if (t.Terminal5 != null) {
                System.out.print (t.Terminal5); 
            }
            if (t.Terminal6 != null) {
                System.out.print (t.Terminal6); 
            }
            if (t.Terminal7 != null) {
                System.out.print (t.Terminal7); 
            }
            if (t.Terminal8 != null) {
                System.out.print (t.Terminal7); 
            }
 
            System.out.println ();
            System.out.println ();
            if (t.NotTerminal1 != null) {
                System.out.print ("<li>");
                printtree (t.NotTerminal1);
                System.out.print ("</li>");
            }
            if (t.NotTerminal2 != null) {
                System.out.print ("<li>");
                printtree (t.NotTerminal2);
                System.out.print ("</li>");
            }
            if (t.NotTerminal3 != null) {
                System.out.print ("<li>");
                printtree (t.NotTerminal3);
                System.out.print ("</li>");
            }
            System.out.print ("</ul>");
    
        }
    }
    
    int count = 0;
    
     public class NotTerminal {
        NotTerminal NotTerminal1;
        NotTerminal NotTerminal2;
        NotTerminal NotTerminal3;
        
        String Terminal1;
        String Terminal2;
        String Terminal3;
        String Terminal4;
        String Terminal5;
        String Terminal6;
        String Terminal7;
        String Terminal8;
    
        
        NotTerminal() {
            this.NotTerminal1 = null;
        }
        
        int getCount() {
            return count;
        }
        void setCount(int count2) {
            count = count2;
        }
            
        boolean isplus() {
            if (SourceCode.length() <= count)
                return false;
            if(SourceCode.charAt(count) == '+') {
                count++;
                return true;
            }   
            return false;
        }
        boolean ismult() {
            if (SourceCode.length() <= count)
                return false;
            if(SourceCode.charAt(count) == '*') {
                count++;
                return true;
            }
            return false;
        } 
        boolean isopenroundbracket() {
            if (SourceCode.length() <= count)
                return false;
            if(SourceCode.charAt(count) == '(') {
                count++;
                return true;
            }
            return false;
        }
        boolean isclosedroundbracket() {
            if (SourceCode.length() <= count)
                return false;
            if(SourceCode.charAt(count) == ')') {
                count++;
                return true;
            }
            return false;
        }
        boolean issemicolon () {
            if (SourceCode.length() <= count)
                return false;
            if(SourceCode.charAt(count) == ';') {
                count++;
                return true;
            }
            return false;
        }
        boolean isset () {
            if (SourceCode.length() <= count+1)
                return false;
            if((SourceCode.charAt(count) == ':') && (SourceCode.charAt(count+1) == '=')) {
                count+=2;
                return true;
            }
            return false;
        }

        boolean isprint () {
            if (SourceCode.length() <= (count + "print".length()))
                return false;
            if(SourceCode.substring(count, count + "print".length()).equals("print")) { 
                count += "print".length();
                return true;
            }
            return false;
        }
        boolean isreturn () {
            if (SourceCode.length() <= (count + "return".length()))
                return false;
            if(SourceCode.substring(count, count + "return".length()).equals("return")) {
                count += "return".length();
                return true;
            }
            return false;
        }
        boolean iswhile () {
            if (SourceCode.length() <= (count + "WHILE".length()))
                return false;
            if(SourceCode.substring(count, count + "WHILE".length()).equals("WHILE")) {
                count += "WHILE".length();
                return true;
            }
            return false;
        }
        boolean isdo () {
            if (SourceCode.length() <= (count + "DO".length()))
                return false;
            if(SourceCode.substring(count, count + "DO".length()).equals("DO")) {
                count += "DO".length();
                return true;
            }
            return false;
        }
        boolean isthen () {
            if (SourceCode.length() <= (count + "THEN".length()))
                return false;
            if(SourceCode.substring(count, count + "THEN".length()).equals("THEN")) {
                count += "THEN".length();
                return true;
            }
            return false;
        }
        boolean isif() {
            if (SourceCode.length() <= (count + "IF".length()))
                return false;
            if(SourceCode.substring(count, count + "IF".length()).equals("IF")) {
                count += "IF".length();
                return true;
            }
            return false;
        }
        boolean iselse() {
            if (SourceCode.length() <= (count + "ELSE".length()))
                return false;
            if(SourceCode.substring(count, count + "ELSE".length()).equals("ELSE")) {
                count += "ELSE".length();
                return true;
            }
            return false;
        }

        boolean isbegin() {
            if (SourceCode.length() <= (count + "BEGIN".length()))
                return false;
            if(SourceCode.substring(count, count + "BEGIN".length()).equals("BEGIN")) {
                count += "BEGIN".length();
                return true;
            }
            return false;
        }
        boolean isend() {
            if (SourceCode.length() <= (count + "END".length()))
                return false;
            if(SourceCode.substring(count, count + "END".length()).equals("END")) {
                count += "END".length();
                return true;
            }
            return false;
        }

        String isconst () {
            String str = "";
            
            if (SourceCode.length() <= count)
                str = null;
            if (!((SourceCode.charAt(count) >= '0') && (SourceCode.charAt(count) <= '9')))
                str = null;
                
            if (count < SourceCode.length()) {
                while ((SourceCode.charAt(count) >= '0') && (SourceCode.charAt(count) <= '9')) {
                    str = str + Character.toString(SourceCode.charAt(count));
                    count++;
                    if (count >= SourceCode.length())
                        break;
                }
            }
            return str;
        }
        String isvarname () {
            String str = "";
            
            if (SourceCode.length() <= count)
                return null;
            if (!((SourceCode.charAt(count) >= 'a') && (SourceCode.charAt(count) <= 'z')))
                return null;        
            str = Character.toString(SourceCode.charAt(count));
            count++;
            return str;
            
        }
    
        String iscop () {
            String str = "";
            
            if ((count+1) < (SourceCode.length())) {
               if ((SourceCode.charAt(count) == '<') && (SourceCode.charAt(count+1) == '=')) {
                  count+=2;
                  str = "<=";
                }
                else if ((SourceCode.charAt(count) == '>') && (SourceCode.charAt(count+1) == '=')) {
                   count+=2;
                   str = ">=";
                }
                else if ((SourceCode.charAt(count) == '=') && (SourceCode.charAt(count+1) == '=')) {
                   count+=2;
                   str = "==";
                }
                else if ((SourceCode.charAt(count) == '!') && (SourceCode.charAt(count+1) == '=')) {
                   count+=2;
                   str = "!=";
                }
                else if ((SourceCode.charAt(count) == '=')) {
                   count+=1;
                   str = "=";
                }
                else if (SourceCode.charAt(count) == '<') {
                   count+=1;
                   str = "<";
                }
                else if (SourceCode.charAt(count) == '>') {
                   count+=1;
                   str = ">";
                }
                else
                  str = null;
            }
            else if (SourceCode.length() <= count) {
                return null;
            }
            else {
                if (SourceCode.charAt(count) == '=')
                   str = "=";
                else if (SourceCode.charAt(count) == '<') 
                   str = "<";
                else if (SourceCode.charAt(count) == '>') 
                   str = ">";
                else 
                   str = null;
               count++;
            }
            return str;
        }

    
    
        NotTerminal boolexpr () {
            String cop;
            NotTerminal nt = new NotTerminal();
            if ((nt.NotTerminal1 = numexpr()) == null)
                return null;
            if ((cop = iscop ()) != null) {
                if ((nt.NotTerminal2 = numexpr()) != null) {
                    nt.Terminal1 = "boolexpr";
                    nt.Terminal2 = cop;
                    return nt;
                }
                return null;
            }
            return null;
        }
        
        NotTerminal squnce () {
            NotTerminal nt = new NotTerminal();
            if((nt.NotTerminal1 = stmnt()) == null) 
                return null;
            if (issemicolon()) {
                nt.Terminal1 = "squnce";
                nt.Terminal2 = ";";
                if((nt.NotTerminal2 = squnce()) != null)
                   return nt;
            }
            return nt;
        }
        
        NotTerminal assgnmnt () {
            NotTerminal nt = new NotTerminal();
            String varnam;
            if ((varnam = isvarname()) != null) {
                nt.Terminal2 = varnam;
                if (isset()) {
                    nt.Terminal3 = ":=";
                    if((nt.NotTerminal3 = numexpr()) != null) {
                        nt.Terminal1 = "assgnment";
                        return nt;
                    }
                }
            }
            return null;
        }
        
        NotTerminal loop () {
            NotTerminal nt = new NotTerminal();
            if (iswhile()) {
                nt.Terminal1 = "WHILE";
                if((nt.NotTerminal1 = boolexpr()) != null) {
                    if (isdo()) {
                        nt.Terminal2 = "DO";
                        if (isbegin()) {
                            nt.Terminal3 = "BEGIN";
                            if ((nt.NotTerminal2 = squnce()) != null) {
                                if (isend()) {
                                    nt.Terminal4 = "loop";
                                    return nt;
                                }
                            }
                        }
                    }
                }
            }
            return null;
        }
        
        NotTerminal cond () {
            NotTerminal nt = new NotTerminal();
            if (isif()) {
                nt.Terminal1 = "IF";
                if((nt.NotTerminal1 = boolexpr()) != null) {
                    if (isthen()) {
                        nt.Terminal2 = "THEN";
                        if (isbegin()) {
                            nt.Terminal3 = "BEGIN";
                            if ((nt.NotTerminal2 = squnce()) != null) {
                                if (isend()) {
                                    nt.Terminal4 = "END";
                                    if (iselse()) {
                                        nt.Terminal5 = "ELSE";
                                        if (isbegin()) {
                                            nt.Terminal6 = "BEGIN";
                                            if ((nt.NotTerminal3 = squnce()) != null) {
                                                nt.Terminal7 = "END";
                                                nt.Terminal8 = "cond";
                                                return nt;
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
            return null;
        }
        
        NotTerminal stmnt () {
            NotTerminal nt = new NotTerminal();
            if (isprint()) {
                nt.Terminal1 = "PRINT";
                if ((nt.NotTerminal1 = numexpr()) != null) {
                    nt.Terminal2 = "stmnt";
                    return nt;
                }
            }
            else if (isreturn()) {
                nt.Terminal1 = "RETURN";
                if ((nt.NotTerminal1 = numexpr()) != null) {
                    nt.Terminal2 = "stmnt";
                    return nt;
                }            
            }
            else if ((nt.NotTerminal2 = assgnmnt()) != null) {
                nt.Terminal1 = "stmnt";
                return nt;
            }
            else if ((nt.NotTerminal2 = loop()) != null) {
                nt.Terminal1 = "stmnt";
                return nt;
            }
            else if ((nt.NotTerminal2 = cond()) != null) {
                nt.Terminal1 = "stmnt";
                return nt;
            }
            return null;
        }
    
    
    NotTerminal numexpr () {
        NotTerminal nt = new NotTerminal();
        if ((nt.NotTerminal1 = term()) != null) {
            if (isplus()) {
                if ((nt.NotTerminal2 = numexpr()) != null) {
                    nt.Terminal1 = "numexpr +";
                    return nt;
                }
                return null;
            }
            return nt;
        }
        return null;
    }

    NotTerminal term () {
        NotTerminal nt = new NotTerminal();
        if ((nt.NotTerminal1 = factor()) != null) {
            if (ismult()) {
                if ((nt.NotTerminal2 = term()) != null) {
                    nt.Terminal1 = "term *";
                    return nt;
                }
                return null;
            }
            return nt;
        }
        return null;
    }

    NotTerminal factor () {
        String str;
        NotTerminal nt = new NotTerminal();
        if (isopenroundbracket()) {
            nt.Terminal1 = "(";
            if ((nt.NotTerminal1 = numexpr()) != null)  {
                if (isclosedroundbracket()) {
                    nt.Terminal2 = "factor";
                    nt.Terminal3 = ")";
                    return nt;
                }
                else
                    System.out.println ("Error");
            }
            return null;
        }
        else if ((str = isconst()) != null) {
            nt.Terminal2 = "const";
            nt.Terminal3 = str;
            return nt;
        }
        else if ((str = isvarname()) != null) {
            nt.Terminal2 = "varname";
            nt.Terminal3 = str;
            return nt;
        }
        else
            System.out.println ("Error");
        return null;
    }
  }
}