# SyntaxHighlighter



## Guest (24. Feb 2006)

Hallo zusammen !

folgende Situation : ich muss bei einem Praktikum ein Paar  Java-programme implementieren unter anderem ein SyntaxHighlighter. beim letzten habe ich alle dazu benötigten klassen implemtiert . das Problem ist: das Ganze compiliert nicht  . .  kann mir jemand helfen oder Tips geben, wie ich weiter kommen kann. Danke im voraus.
hier sind meine Klassen .

```
public interface Design {
    public void design(Lexer.Comment x);
    public void design(Lexer.Literal x);
    public void design(Lexer.NoSign x);
    public void design(Lexer.KeyWord x);
    public void design(Lexer.UnColoured x);
    public void design(Lexer.Identifier x);
    public void design(Lexer.NumberStuff x);
    public void design(Lexer.Format x);
    
    public void design(Class<? extends Symbol> x);
}
 



public class DesignHTML implements Design{
    String c = null;
      public String getCode(){
        return c;
    }
     public void writeCodeToFile(String file){
        FileIO lIO = new FileIO();
        lIO.writeIt(file, c);
    }
     private void addHTMTags(String lexem, String color){
        c = c + "<font color="+'"'+ color + '"'+">";
    }
      public void design(Lexer.Comment x) {
        addHTMTags(x.lexem, "#009900");
    }
  public void design(Lexer.Literal x) {
        addHTMTags(x.lexem, "#0000FF");
    }
  public void design(Lexer.NoSign x) {
        c = c + x.lexem;
    }
 public void design(Lexer.KeyWord x) {
        addHTMTags(x.lexem, "#FF00FF");
    }
  public void design(Lexer.UnColoured x) {
        addHTMTags(x.lexem, "");
    }
public void design(Lexer.Identifier x) {
        addHTMTags(x.lexem, "#00FFFF");
    }
public void design(Lexer.NumberStuff x) {
        addHTMTags(x.lexem, "#0000FF");
    }
public void design(Lexer.Format x) {
        addHTMTags(x.lexem, "#CC9900");
    }
 public void design(Class<? extends Symbol> x) {
        System.out.println("Error resolving Symbol");
    }
}




import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class FileIO {

    public String readIt(String file) {
        String inhalt;
        try {
            inhalt = readFile(file);
            return inhalt;
        } catch (FileNotFoundException e) {
            System.out.println("---Datei nicht gefunden");   
        } catch (IOException e) {
            System.out.println("---IO Fehler");   
        }
        return null;
    }

    public void writeIt(String file, String text) {
        if (file==null){
            System.out.println("!!!Fehler bei Dateiausgabe : Dateiname ungültig");
            return;
        }
        if (text==null){
            System.out.println("!!!Fehler bei Dateiausgabe : Text ungültig");
            return;
        }
        try {
            writeFile(file, text);
        } catch (FileNotFoundException e) {
            System.out.println("---Datei nicht gefunden");   
        } catch (IOException e) {
            System.out.println("---IO Fehler");   
        }
    }
    
    private String readFile(String fileName)throws FileNotFoundException, IOException{
        File datei = new File(fileName);
        FileReader leser = new FileReader(datei);
        int b;
        char c;
        String retVal="";
        System.out.println("---Lese Datei "+fileName);
        while (true){
            b = leser.read();
            if(b == -1){break;}
            c=(char)b;
            //System.out.print(c);
            retVal = retVal + c;
        }
        System.out.println("---Lesen Beendet");
        return retVal;
    }
 private void writeFile(String fileName, String myString)throws FileNotFoundException, IOException{
        File datei = new File(fileName);
        FileWriter schreiber = new FileWriter(datei);
        int b;
        System.out.println("---schreibe Datei "+fileName);
        for (int c=0;c<myString.length();c++){
            b=(int)myString.charAt(c);
            schreiber.write(b);
            System.out.print((char)b);
        }
        System.out.println("\n---Lesen Beendet");
    }}





import java.util.Arrays;
import java.util.LinkedList;

public interface JavaRulesIF {
   public final String inputCharacter = ".";    /* any input character */;
   public final String notStar = "^\\*";   /* any input character except star */;
   public final String notStarNotSlash = "[^\\*\\\\]";    /*
                                             * any input character
                                             * except star or slash
                                             */;

    public final String uniCodeLetter = "\\w";   /* any unicode letter */;
    public final String uniCodeDigit = "\\d";   /* any unicode digit */;
    public final String javaLetter = "("+uniCodeLetter+"|$|_)";  /*
                                         * unicode letter or '$' or
                                         * '_'
                                         */ ;
    public final String javaLetterOrDigit = "("+javaLetter+"|"+uniCodeDigit+")";      /*
                                             * unicode letter or
                                             * unicode digit or'$' 
                                             * or '_'
                                             */;
    public final String nonZeroDigit = "[1-9]"  /* digit '1' to '9' */;
    public final String digit = "[0-9]"     /* digit '0' to '9' */;
    public final String hexDigit = "[0-9A-Fa-f]"    /*
                                     * digit '0' to '9' or character
                                     * 'A' to 'F' or 
                                     * character 'a' to 'f'
                                     */;

    public final String octalDigit = "[0-7]"    /* digit '0' to '7' */;
    public final String zeroToThree = "[0-3]"   /* digit '0' to '3' */;
    public final String decimalNumeral = "(0|" + nonZeroDigit + digit + "*)";
    public final String hexNumeral = "(0(x|X)" + hexDigit + "+)";
    public final String octalNumeral = "(0" + octalDigit + "+)";
    public final String integerTypeSuffix = "(l|L)";
    public final String exponentPart = "((e|E)" + "(\\+|-)?" + digit + "+)";
    public final String floatTypeSuffix = "(f|F|d|D)";
    public final String singleCharacter = "[^'\\\\]";
    public final String octalEscape = "\\\\" + "(" + octalDigit + octalDigit
            + "?" + "|" + zeroToThree + octalDigit + octalDigit + ")";
    public final String escapeSequence = "(\\'|\\\\\"|\\b|\\r|\\n|\\t|\\f|\\\\|\\("
            + octalEscape + ")";
    public final String stringCharacter = "([^\\\"]|" + escapeSequence + ")";

    /*
     * begin of tokens whiteSpaces
     */
    public final String lineTerminator = "\\n";
    public final String whiteSpace = "(\\s)+";

    /*
     * comments
     */
    public final String traditionalComment = "\\/\\**\\*\\/";     /* traditonal comment (=multiline comment) */;
    public final String documentationComment = "\\/\\*\\*("+stringCharacter+"*)\\*\\/";     /**
                                                 * documentation
                                                 * comment (= javadoc comment)
                                                 */;

    public final String endOfLineComment = "//" + inputCharacter + "*"
            + lineTerminator + "?";
    public final String decimalIntegerLiteral = decimalNumeral
            + integerTypeSuffix + "?";
    public final String hexIntegerLiteral = hexNumeral + integerTypeSuffix
            + "?";
    public final String octalIntegerLiteral = octalNumeral + integerTypeSuffix
            + "?";
    public final String floatingPointLiteral = digit + "+" + "\\." + digit
            + "*" + exponentPart + "?" + floatTypeSuffix + "?" + "|" + "\\."
            + digit + "+" + exponentPart + "?" + floatTypeSuffix + "?" + "|"
            + digit + "+" + exponentPart + floatTypeSuffix + "?" + "|" + digit
            + "+" + exponentPart + "?" + floatTypeSuffix;
    public final String characterLiteral = "'" + "(" + singleCharacter + "|"
            + escapeSequence + ")" + "'";
    public final String stringLiteral = "\\\"" + stringCharacter + "*" + "\\\"";
    public final String identifier = javaLetter + javaLetterOrDigit + "*";
    public final String endOfFile = "\\\\z";

    /*
     * ruleArray
     * here please fill in the rules above in an appropriate order
     *    like { rule1, rule2, rule3 }
     * consider the priority of the rules to avoid false positive matchings
     */
    char c='"';
    public final String[] ruleArray = {  
            endOfFile
            , endOfLineComment, documentationComment, traditionalComment
            
            , characterLiteral, stringLiteral
            , lineTerminator, whiteSpace

            , "(public|final|private|import|interface|class|void|static)"
            , "(null|int|single|double|char|boolean|String|Integer|Double|Float)"
            , "(for|while|do)"
            , identifier

            , floatingPointLiteral, octalIntegerLiteral, hexIntegerLiteral, decimalIntegerLiteral
            , stringCharacter, escapeSequence, octalEscape
            
            //, identifier
            , floatTypeSuffix, exponentPart, integerTypeSuffix
            , hexNumeral, decimalNumeral, octalNumeral
            , hexDigit, javaLetterOrDigit, javaLetter
            , digit, nonZeroDigit, zeroToThree
            
            //, "(\\(|\\)|\\{|\\}|\\[|\\])"
            //, "(\\=\\=|\\!\\=|\\<|\\>|\\<\\=|\\>\\=)"   //vgl ==,!=,<,>,<=,>=
            //, "(\\=|\\+|\\-|\\*|\\\\)+"    //Operatoren
            //, "[a-z]+[A-Z|a-z|0-9]*\\s*\\(\\)"     //Funktionen
    };

    public final LinkedList<String> ruleList = new LinkedList<String>(Arrays.asList(ruleArray));
}





import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Lexer implements JavaRulesIF{
    private String myString;
    @SuppressWarnings("unchecked")
    public Class <? extends Symbol>[] typeArray;

    public class Comment extends Symbol{public void Entscheide(Design d) {d.design(this);}}
    public class Literal extends Symbol{public void Entscheide(Design d) {d.design(this);}}
    public class NoSign extends Symbol{public void Entscheide(Design d) {d.design(this);}}
    public class KeyWord extends Symbol{public void Entscheide(Design d) {d.design(this);}}
    public class UnColoured extends Symbol{public void Entscheide(Design d) {d.design(this);}}
    public class Identifier extends Symbol{public void Entscheide(Design d) {d.design(this);}}
    public class NumberStuff extends Symbol{public void Entscheide(Design d) {d.design(this);}}
    public class Format extends Symbol{public void Entscheide(Design d) {d.design(this);}}
    
    public void setString(String theString){
        myString = theString;
    }

    public Symbol nextToken(){
        for (int c=0;c<JavaRulesIF.ruleArray.length;c++){
            if (myString.length()==0) break;
            String tmp = JavaRulesIF.ruleArray[c];
            Pattern p = Pattern.compile(tmp);
            Matcher m = p.matcher(myString);
            if (m.find() && (m.start()==0)){
                if (m.end()>=myString.length()) {
                    tmp = myString;
                    myString="";
                    return null;
                }
                myString = myString.substring(m.end(),myString.length());
                Symbol q = null;
                    try {
                        System.out.println(typeArray.length);
                        q = typeArray[c].newInstance();
                    } catch (InstantiationException e) {
                        e.printStackTrace();
                    } catch (IllegalAccessException e) {
                        e.printStackTrace();
                    }
                q.lexem = m.group();
                return q;
            }
        }
        return null;
    }

    public Lexer(){
        typeArray = {
                new UnColoured()
                , new Comment(), new Comment(), new Comment()
                
                , new Literal(), new Literal()
                , new UnColoured(), new UnColoured()

                , new KeyWord()
                , new KeyWord()
                , new KeyWord()
                , new Identifier()

                , new NumberStuff(), new NumberStuff(), new NumberStuff(), new NumberStuff()
                , new Comment(), new Format(), new Format()
                
                , new NumberStuff(), new NumberStuff(), new NumberStuff()
                , new NumberStuff(), new NumberStuff(), new NumberStuff()
                , new NumberStuff(), new NumberStuff(), new NumberStuff()
                , new NumberStuff(), new NumberStuff(), new NumberStuff()
        };
        System.out.println(typeArray.length);
    }

}






public class Run {
    static String fileContent = "";
    static Lexer mLex = new Lexer();
    static FileIO mIO = new FileIO();
    static DesignHTML mDes = new DesignHTML();
    
    public static void main(String[] args){
        Symbol lSym;
        if (args.length<2){
            System.out.println("Pleasy Supply Parameters: input file and output file.");
            return;
        }
        String file_in = args[0]; 
        String file_out = args[1]; 
        fileContent = mIO.readIt(file_in);
        mLex.setString(fileContent);
        lSym = mLex.nextToken();
        System.out.println("Lexem : "+lSym.lexem);
        while (lSym!=null){
            lSym = mLex.nextToken();
            System.out.println("Lexem : "+lSym.lexem);
            lSym.Entscheide(mDes); 
            System.out.println("Lexem : "+lSym.lexem);
        }
        mDes.writeCodeToFile(file_out);
    }

}





public abstract class Symbol {
    public String lexem;
    public abstract void Entscheide(Design d);
}
```


----------



## byte (24. Feb 2006)

Du willst nicht ernsthaft behaupten, dass Du den Code runtergeschrieben hast ohne ein einziges mal zu compilieren?


----------



## Guest (24. Feb 2006)

byto hat gesagt.:
			
		

> Du willst nicht ernsthaft behaupten, dass Du den Code runtergeschrieben hast ohne ein einziges mal zu compilieren?



doch schon . ich brauche nun nur Tips od so damit ,ich weiter komme.. es wurde mir von einem folgendes gesagt :"
 das Problem ist einfach, die classes in eine Liste zu schreiben. Beim durch -matchen kannst du dann ja diese Paare abfragen."   ich weiss nicht jetzt , ob das überhaupt geht..

Co


----------



## byte (24. Feb 2006)

Was kommt denn für eine Fehlermeldung?


----------



## Beni (24. Feb 2006)

Ob der Rest deines Codes Sinn  macht, kann ich nicht sagen, aber wie man das Array richtig initialisieren würde, das kann ich sagen:

```
public Lexer(){
        typeArray = new Class[]{
                UnColoured.class,
                Comment.class,
                
                // und so weiter
        };
        System.out.println(typeArray.length);
    }
```


----------



## Student (10. Mrz 2006)

Falls das hier noch aktuell ist.

Vielleicht hilft es Dir ja mal in die Highlighter-Klasse reinzuschauen, die Du hier beziehen kannst.
:arrow: http://syntax.jedit.org/

Die soll zwar nicht so der Brüller sein, aber wer weiß ..  vielleicht kann man sich da noch etwas "abschauen" bzw. sich inspirieren lassen.

Grüße Ben.


----------

