Habe Probleme mit dem StreamTokenizer



  • Hallo !
    Ich habe folgende Klassen geschrieben um einen kleinen Parser zu schreiben und zu Testen

    Das ist die Basisklasse:

    package parser;
    
    import java.io.IOException;
    import java.io.FileReader;
    import java.io.StreamTokenizer;
    
    public abstract class FileParser extends StreamTokenizer 
    {
    	/**
    	 * @param fileName - Dateiname incl. Pfad
    	 * @param deli - Zeichen welches als delimiter (Trennzeicher) verwendet wird -- wird noch nicht beachtet
    	 * @throws IOException 
    	 */
    	public FileParser(String fileName, String deli) throws IOException
    	{
    		super(new FileReader(fileName));
    		eolIsSignificant(true);
    		parseNumbers();
    	}
    	public void parse() throws IOException
    	{
    		int tval; // token value
    		System.out.println("Zeile: "+ this.lineno());
    		while((tval=this.nextToken()) != StreamTokenizer.TT_EOF);
    		{
    			if (tval == StreamTokenizer.TT_EOL) 
    				processNewLine();
    			else if(tval == StreamTokenizer.TT_NUMBER)
    				processNumber(this.nval);
    			else if(tval == StreamTokenizer.TT_WORD)	
    				processString(this.sval);
    			System.out.println("token: "+tval);
    		}
    	}
    	abstract public void processString(String token);
    	abstract public void processNumber(double num);
    	abstract public void processNewLine();
    }
    

    Das ist eine TestKlasse welche von Fileparser abgeleitet ist:

    package test;
    
    import java.io.IOException;
    
    import parser.FileParser;
    
    public class TestDataParser extends FileParser
    {
    	/**
    	 * @param fileName
    	 * @param deli
    	 * @throws IOException
    	 */
    	public TestDataParser(String fileName, String deli) throws IOException
    	{
    		super(fileName, deli);
    	}
    	public void processString(String token)
    	{
    		System.out.println(token);
    	}
    	public void processNumber(double num)
    	{
    		System.out.println(num);
    	}
    	public void processNewLine()
    	{
    		System.out.println("newLine");
    	}
    }
    

    Das ist die Test Klasse:

    package test;
    
    import java.awt.Frame;
    import java.io.IOException;
    
    public class TestApp extends Frame
    {
    	public TestDataParser paser;
    
    	public TestApp()
    	{
    		String fn = "data//data.txt";
    		try
    		{
    			paser = new TestDataParser(fn, " ");
    			paser.parse();
    		}catch(IOException e)
    		{
    			System.out.println(e.getMessage());
    		}
    	}
    	public static void main (String[] args)
    	{
    		new TestApp();
    	}
    }
    

    Das Problem ist nun folgendes:
    Also das File data.txt wird gefunden. Daran liegts also nicht. Mit einem Beispielprogamm aus "Java ist auch eine Insel" funtionierts auch. Aber
    das Beispielprogramm ist nicht großartig ander als meins, außer das ich vererbe.
    In der Klasse FileParser, Methode parse() gebe ich einmal die Zeile und das aktuele Token aus. Aber das Token ist immer TT_EOF (Datei zu Ende). Seltsam finde ich noch das das Programm dann überhaupt in die Schleife springt.

    Es wäre nett wenn sich das mal jemand anschauen könnte, ich sehe zur Zeit einfach den Fehler nicht.

    mfg
    Plasmo



  • Hi,

    probiere es mal so (hat bei mir so geklappt, benutze ttype für den aktuellen Wert):

    package parser; 
    
    import java.io.IOException; 
    import java.io.FileReader; 
    import java.io.StreamTokenizer; 
    
    public abstract class FileParser extends StreamTokenizer  
    { 
        /** 
         * @param fileName - Dateiname incl. Pfad 
         * @param deli - Zeichen welches als delimiter (Trennzeicher) verwendet wird -- wird noch nicht beachtet 
         * @throws IOException  
         */ 
        public FileParser(String fileName, String deli) throws IOException 
        { 
            super(new FileReader(fileName)); 
            eolIsSignificant(true); 
            parse();
        } 
        public void parse() throws IOException 
        { 
            System.out.println("Zeile: "+ this.lineno()); 
            nextToken();
            while(ttype != TT_EOF) 
            { 
                switch(ttype){
                	case TT_EOL:processNewLine(); break;
                	case TT_NUMBER: processNumber(nval); break; 
                	case TT_WORD: processString(sval); break;
                	default: System.out.println("Token unknown.");
                }
                System.out.println("Token: "+ /*(char)*/ttype); 
                nextToken();
            } 
        } 
        abstract public void processString(String token); 
        abstract public void processNumber(double num); 
        abstract public void processNewLine(); 
    }
    


  • Hallo !

    DANKE für deine Hilfe. Die Version die du vorschlägst finde ich sehr schön und sie funzt auch. 👍
    Als ich dass gesehen habe wollte ich nun aber doch noch wissen, warum mein ursprünglicher Code buggy war.
    Und siehe da, son doofer Fehler. In der Methode parse() von der Klasse FileParser
    befindet sich folgende Zeile:

    ...
    while((tval=this.nextToken()) != StreamTokenizer.TT_EOF);
    {
      ...
    }
    

    Das ";" am Ende der while Schleife sollte dort nicht stehen, wenn ich möchte das der Block ausgeführt wird. 🙂
    Das erklärt auch, warum das Programm trotz nicht erfüllter Bedingung in den Schleifenrumpf gesprungen ist.

    Thanx for all !

    PlAsMo



  • Upss, habe ich ganz übersehen. Ich habe den Code gleich in den Editor gecopyt und als ich das ; sah, dachte ich, dass ich das ausversehen rein gemacht habe. 🙄 😉


Anmelden zum Antworten