10390.txt0000644000076400001440000000067710167776200013000 0ustar markususers00000000000000Korrektheit: 10 Verwendbarkeit: 0 Programmierstil:4 Dokumentation: Leider nicht objektorientiert. Ansonsten sehr gut gelöst. Lobenswert ist die Exception EOF die sehr passend ist. Das Programm ist leider nicht in irgendeiner Form wiederverwendbar. Vielleicht solltest du einige Funktionen auslagern. Der Programmierstil ist auch nicht gerade, was man sich von einem so kurzen Programm erwarten kann. Kommentare sind aber genug und passend. 10823.txt0000644000076400001440000000072310167776635013005 0ustar markususers00000000000000Korrektheit: 10 Verwendbarkeit: 8 Programmierstil:4 Dokumentation: Die Dokumentation ist sehr gut, aber auch kurz. Leider nicht objektorientiert. Ansonsten sehr gut gelöst. Lobenswert ist die Verwendung von vielen Funktionen. Einige Funktionen sind möglicherweise wiederverwendbar. Trotzdem ist das Hauptprogramm noch recht lang. Der Programmierstil ist ok. Kommentare sind aber genug und passend. Sehr gut ist, dass die einzelne Funktionen kommentiert sind! html/Parser.java0000644000076400001440000001206410170005066014604 0ustar markususers00000000000000package html; import eprog.*; /**Htmlparser. * Dieser Parser kann einen Teil von Html * richtig erkennen. Die Formatierung wird * einfach in einem String geschrieben.*/ public class Parser { // Private Variablen private String formatstring; private int state; private int prevstate; private int tablebegin; private int spalten; private int zeilen; // state kann folgende Zustände annehmen private final int NONE = 0; private final int HTML = 1; private final int H2 = 2; private final int H3 = 3; private final int H4 = 4; private final int H5 = 5; private final int HEAD = 10; private final int TITLE = 11; private final int BODY = 20; private final int TABLE = 100; private final int TBODY = 101; private final int TR = 110; private final int TD = 120; private final int ATEND = 100000; // Der Konstruktor public Parser () { state = NONE; formatstring = ""; } /* end gibt zurück, ob der Parser * den Endtoken gefunden hat.*/ public boolean end () { return state == ATEND; } /* Diese Funktion wird bei Token verwendet * die öffnend sind. * z.b. * sate wird neu gesetzt und der Formatstring * wird erweitert*/ public void begintoken (String Token) throws Exception { prevstate = state; if (state == NONE && Token.equals("HTML")) state = HTML; else if (state == HTML && Token.equals ("HEAD")) state = HEAD; else if (state == HTML && Token.equals ("BODY")) state = BODY; else if ((state == BODY || state == TD) && Token.length()==2 && Token.charAt(0)=='h') { if (Token.charAt(1) == '2') { formatstring += "Text_sehr_gross"; state = H2; } else if (Token.charAt(1) == '3') { formatstring += "Text_gross"; state = H3; } else if (Token.charAt(1) == '4') { formatstring += "Text_mittel"; state = H4; } else if (Token.charAt(1) == '5') { formatstring += "Text_normal"; state = H5; } else throw new Exception ("Nicht definierte Überschrift!"); } else if (state == BODY && Token.equals ("BR")) formatstring += "\n"; else if (state == HEAD && Token.equals ("TITLE")) { formatstring += "Titel"; state = TITLE; } else if (state == BODY && Token.equals("TABLE")) { if (formatstring.length()>0 && ! formatstring.endsWith("\n")) formatstring += " "; formatstring += "Tabelle "; tablebegin = formatstring.length(); spalten = 0; zeilen = 0; state = TABLE; } else if(state == TABLE && Token.equals("TBODY")) state = TBODY; else if(state == TBODY && Token.equals("TR")) { spalten++; state = TR; } else if(state == TR && Token.equals("TD")) { zeilen++; state = TD; } else throw new Exception ("Kann hier nicht aufgemacht werden: " + Token); } /* Hier wird bestimmt, was mit den Endtoken * passieren soll. State wird wieder zurück * gesetzt und der Formatstring wird angepasst*/ private void endtoken(String Token) throws Exception { if (state == HTML && Token.equals("HTML")) { if (formatstring.length()>0 && ! formatstring.endsWith("\n")) formatstring += " "; formatstring += "Ende"; state = ATEND; } else if (state == HEAD && Token.equals("HEAD")) state = HTML; else if (state == BODY && Token.equals("BODY")) state = HTML; else if (Token.length() == 2 && Token.charAt(0) == 'h') { formatstring += ";"; if ( state == H2 && Token.charAt(1) == '2' || state == H3 && Token.charAt(1) == '3' || state == H4 && Token.charAt(1) == '4' || state == H5 && Token.charAt(1) == '5') state = prevstate; else throw new Exception ("Falsche Überschrift " + "geschlossen h" + Token.charAt(1)); } else if (state == TITLE && Token.equals ("TITLE")) { formatstring += ";"; state = HEAD; } else if (state == TD && Token.equals("TD")) state = TR; else if (state == TR && Token.equals("TR")) state = TBODY; else if (state == TBODY && Token.equals("TBODY")) state = TABLE; else if(state == TABLE && Token.equals("TABLE")) { String s1 = formatstring.substring(0, tablebegin); s1+=spalten; s1+=" "; s1+=zeilen; s1+=" "; s1+=formatstring.substring(tablebegin); ; formatstring = s1; state = BODY; } else throw new Exception ("Falsch zugemacht!"); } /* Diese Funktion parst die Token aus dem String * heraus. Da der String nur ein Token oder * ein Wort beinhaltet ist die Funktion trivial.*/ public void parse (String str) throws Exception { if (str.charAt(0) == '<') // Token found! { String Token; // stores the Token if (str.charAt(str.length()-1) != '>') // invalid Token throw new Exception ("> nicht gefunden!"); if (str.charAt(1) == '/') endtoken(str.substring(2,str.length()-1)); else begintoken(str.substring(1,str.length()-1)); } else { if ( state == TITLE || state >= H2 && state <= H5) formatstring += " " + str; } } /* Gibt den formatierten String zurück. Der Inhalt ist nur * korrekt, wenn weder eine Exception geworfen wurde und * end() true zurückgibt.*/ public String formated () { return formatstring; } } Main.java0000644000076400001440000000111210170010500013245 0ustar markususers00000000000000import html.*; import eprog.*; class Main { public static void main (String [] argv) { Parser p = new Parser(); int laenge = 0; String gelesen; boolean fehler = false; try { while (! p.end()) { gelesen = EprogIO.readWord(); laenge += gelesen.length(); if (laenge > 300) // throw new Exception ("String zu lang"); fehler = true; p.parse (gelesen); } } catch (Exception e) { fehler = true; // EprogIO.println (e.toString()); } if (fehler) EprogIO.println ("FALSCHE EINGABE"); else EprogIO.println (p.formated()); } } html.txt0000644000076400001440000000111310170003612013232 0ustar markususers00000000000000html Parser Author: Markus Raab Dieser Parser ist eine straight-forward Implementierung für HTML. Erweiterungen für weitere HTML Tags können sehr leicht hinzugefügt werden. Man muß einfach einen state für diesen Tag definieren und in begintoken() und endtoken() definieren was bei diesen passieren soll. Das Parsen an sich ist trivial, da Tags und Wörter laut Definition nicht im selben String vorkommen können. Deshalb muß nur überprüft werden, ob der String mit '<' anfängt oder nicht. formated() gibt dann den entstandenen String zurück. Bei Fehler wird eine Exception geworfen.
Fr Jul 30 13:54:24 CEST 2021
patent_button.gif valid-html401.png elektra.jpg fsfe-logo.png valid-css.png vim.gif anybrowser.gif