Leerzeilen Erkennung mit JavaCC?

MadMax2581

Mitglied
Hallo alle zusammen! Hab mal wieder ein Problem und hoffe das ihr mir helfen könnt.

Haba ein Mapfile was ca. so aussieht:

...
-------
Modules
-------

..\objects\crtsi.o:
start 00008285 end 0000831d length 152 section TEXT (.text)
start 00000000 end 00000048 length 72 section .debug

..\objects\ramcheck_asm.o:
start 0000831d end 0000845b length 318 section TEXT (.text)
start 00000048 end 00000097 length 79 section .debug

..\objects\mcu.o:
start 0000011a end 00009c86 length 39788 section .debug
start 00008550 end 00008572 length 34 section TEXT (.text)
start 00008572 end 0000857a length 8 section TEXT (.text)
start 0000857a end 0000857d length 3 section TEXT (.text)

..\objects\port.o:
start 00009c86 end 000137b4 length 39726 section .debug
start 0000857d end 000085ed length 112 section TEXT (.text)
start 000085ed end 000085fd length 16 section TEXT (.text)

..\objects\gpt.o:
start 000137b4 end 0001d48d length 40153 section .debug
start 00008071 end 00008079 length 8 section CONST (.const)
start 000085fd end 00008628 length 43 section TEXT (.text)
start 00008628 end 0000863a length 18 section TEXT (.text)
start 0000863a end 0000864d length 19 section TEXT (.text)

..\objects\scheduler.o:
start 00000223 end 0000022c length 9 section EXTENDED (.bss)
start 00000070 end 00000074 length 4 section DIRECT (.ubsct)
start 0001d48d end 000274f0 length 41059 section .debug
start 0000864d end 000087d4 length 391 section TEXT (.text)
start 000087d4 end 000087dd length 9 section TEXT (.text)
start ******** end ******** length 0 section TEXT *** removed ***
start 000087dd end 00008805 length 40 section TEXT (.text)
start 00008805 end 0000881d length 24 section TEXT (.text)

..\objects\sbc.o:
start 00000328 end 00000332 length 10 section EXTENDED (.bss)
start 00239dd3 end 0024491a length 43847 section .debug
start 00008284 end 00008285 length 1 section CONST (.const)
start 0000bb68 end 0000bbc5 length 93 section TEXT (.text)
start ******** end ******** length 0 section TEXT *** removed ***
start 0000bbc5 end 0000bbe5 length 32 section TEXT (.text)
start 0000bbe5 end 0000bc17 length 50 section TEXT (.text)
start 0000bc17 end 0000bc29 length 18 section TEXT (.text)
start 0000bc29 end 0000bc3c length 19 section TEXT (.text)
start 0000bc3c end 0000bc4e length 18 section TEXT (.text)
start 0000bc4e end 0000bc7e length 48 section TEXT (.text)
start 0000bc7e end 0000bc91 length 19 section TEXT (.text)
start ******** end ******** length 0 section TEXT *** removed ***
start ******** end ******** length 0 section TEXT *** removed ***
start ******** end ******** length 0 section TEXT *** removed ***
start ******** end ******** length 0 section TEXT *** removed ***
start ******** end ******** length 0 section TEXT *** removed ***
start ******** end ******** length 0 section TEXT *** removed ***
start 0000bc91 end 0000bc95 length 4 section TEXT (.text)
start 0000bc95 end 0000bca2 length 13 section TEXT (.text)
start 0000bca2 end 0000bcc1 length 31 section TEXT (.text)
start 0000bcc1 end 0000bcde length 29 section TEXT (.text)
start 0000bcde end 0000bce2 length 4 section TEXT (.text)
start 0000bce2 end 0000bcfc length 26 section TEXT (.text)
start 0000bcfc end 0000bd1d length 33 section TEXT (.text)
start 0000bd1d end 0000bd9b length 126 section TEXT (.text)

..\objects\vector_aw32.o:
start ******** end ******** length 0 section EXTENDED *** removed ***
start 0024e3ee end 00257f9d length 39855 section .debug
start 0000bd9b end 0000bd9d length 2 section TEXT (.text)
start 00008017 end 00008065 length 78 section VCT (.vectable)

..\objects\psa_t8_ftc.o:
start 00257f9d end 00257ff7 length 90 section .debug
start 00008000 end 00008010 length 16 section FTC (.FLASHTOOLCODE)



-----------
Stack usage
-----------

...

Jetzt hab ich das File mittels JavaCC in die einzelnen Blöcke (Modules, Stack usage, ...) zerlegt. Jetzt muss ich noch die einzelnen Unterblöcke ( ... .o: ) zerlegen und bestimmte Sachen auslesen.

Jetzt bräuchte ich Hilfe bei der Erkennung der Leerzeilen zwischen den Unterblöcken.

..\objects\crtsi.o:
start 00008285 end 0000831d length 152 section TEXT (.text)
start 00000000 end 00000048 length 72 section .debug
<-------------- diese hier --------------->
..\objects\ramcheck_asm.o:
start 0000831d end 0000845b length 318 section .text
start 00000048 end 00000097 length 79 section .debug

Die Wörter "start", "end", "length" und "section" sind als Schlüsselwörter festgelegt.
Mein Problem ist nun das z. B. "..\objects\ramcheck_asm.o:" auch Strings sind, geht aber nicht anders, weil sie noch an andere Stellen vorkommen, wo sie keine Schlüsselwörter sein dürfen. Der Rest (".debug", "TEXT (.text)", ".text") sind Strings, liegt ein Leerzeichen dazwischen sind es verschiedene Strings. Da ich aber nun vorher nicht weiss wie viele String es sind, vermischen sich die Blöcke bei zerlegen (brauche Daten von jedem .o einzeln).

Weiss jemand wie ich mit JavaCC die Leerzeilen zwischen den Blöcken erkennen kann und so jeden einzeln habe? Oder hat jemand eine andere Idee wie ich das mit JavaCC lösen könnte?

Schon mal danke für eure Hilfe!

Max
 
<emptLine> ::= <StartOfLine> <Whitespace>* <EndOfLine>

So würde ich das machen.
StartOfLine müsste $ sein
EndOfLine \n oder \r oder beides
WhiteSpace... hmm.... \w oder sowas. Musste mal raussuchen.
 
Hmmm. Danke für die Antwort, aber ich versteh nur Bahnhof.

StartOfLine --> gibts das bei JavaCC überhaupt?
EndOfLine --> ist \n, dass hat doch aber jede Zeile
WhiteSpace --> ? müsste " " sein

Wenn ich EndOfLine anlege muss ich das bei jeder Zeile suchen, auch in Abschnitten wo ich gar nichts machen will. Bei mehreren tausend Zeilen wird das echt aufwendig, denn ich müsste das WhiteSpace ja auch überall suchen.

Kannste mir nochmal erklären wie du das meinst, vielleicht hab ich es ja auch nur falsch verstanden. Oder haste noch ne andere Idee?

Max
 
Ich glaube du hast den Sinn und Zweck einer Grammatik noch nicht so ganz verstanden.

Wie sieht deine Grammatik denn bisher aus?
 
Erst einmal ein "Hallo" an alle,
das ist auch mein erster Beitrag,
mein erster Eindruck von diesem Forum ist sehr positiv,
ich werd' mal öfters hier reinschauen.....

also nun zu meinem ersten Problem:

ich will aus einem eingelesenem Text herausfinden, wie viele Zeilen dieser Text beinhaltet.
Dafür habe ich auch schon einen Progarmm geschrieben, doch derzeit erhalte ich die Anzahl von allen Zeilen. Ich will aber, dass die Leerzeilen nicht mitgezählt werden.....

Könntet ihr mir vllt mal sagen, mit welcher Methode ich vergleichen könnte, ob die Zeile, die ich kontrolliere, eine Leerzeile ist.

Damit Ihr nichts negatives über mich denkt, zeige ich auch, dass ich bisher etwas getan habe... :)

import java.util.Scanner;
import java.io.*;

class Zeilenzaehler
{
public static void main (String [] args) throws IOException{
String zeile;
Scanner datei = new Scanner(new File(args[0]));
int zaehler = 0;

while (datei.hasNextLine()){
zeile = datei.nextLine();
if(datei.equals('\n'))
{
System.out.println("Hier ist eine Leerzeile");
}

else
zaehler++;
}
System.out.println("Die angegebene Datei hat " + zaehler + " Zeile(n)!");
}}

Hier versuche ich es mit der Methode .equals; hat aber irgendwie nicht geklappt...

Ich bedanke mich schon einmal im voraus,
und wünsche euch einen schönen abend
 
Hy! Das schreiben in diesem Beitrag hat im Endeffekt viel mehr Zeit in Anspruch genommen als die eigentliche Problemlösung ;-).

=================================================================

zu Zeja:

Erstmal danke das du dich mit meinem Problem beschäftigt hast und versuchst mir zu helfen.

Zu deiner konstruktiven Kritik:

Habe mich schon mit mehreren Parsergeneratoren beschäftigt und schon die verschiedensten Sachen in ANTLR/ANTXR, Lex/Yacc, Jay, JavaCC geschrieben. Denke schon das ich das mit den Grammatiken verstanden habe.

Mit Parsergeneratoren scheinst du dich ja gut auszukennen, aber hast du überhaupt schon mal was mit JavaCC gemacht? Nur Spass, wollte nur etwas ärgern ;-). Nicht falsch verstehen, war nicht böse gemeint.

Hab das Problem selber gelöst bekommen. Hatte mich etwas mit der Grammatik verrannt. War ganz kurz vor dem beenden der Problemstellung. Kam dann aber an einem Punkt wo, egal was man machte, ein Konflikt entstand. Dadurch ging dann nichts mehr so wie es sollte (obwohl es eigentlich hätte gehen müssen).

Hab das Konzept des Parsergenerators nochmal überdacht und anders geschrieben, jetzt geht es.

Wenn die Änderung zur Problemlösung interessiert:

Hatte alle Zeilenumbrüche (\n) mittels des Skip-Blocks von JavaCC gleich völlig ignoriert, was in vielen anderen Fällen ja auch ok ist und bis zu der Stelle auch wunderbar klappte. Hab jetzt einfach ein eigenes Token für \n gemacht und den Quelltext darauf hin angepasst. Dann ging es wunderbar.

=================================================================

zu turqo:

?

Du hast, auch wenn es sich erstmal ähnlich anhört, ein völlig anderes Thema! Das hat mit meinem Problem rein gar nichts zutun. Du musst im Forum einfach eine eigene Frage eröffnen, dann bekommst du dort auch Lösungen dafür.

Jetzt trotzdem kurz zu deinem Problem:

Hab es jetzt nicht wirklich probiert, aber ich würde es so machen. Ist ein ähnlicher Ansatz wie deiner, mit leichten Veränderungen. Ist jetzt in ner eigenen Datei und kein Programm, aber das kannst du dir dann halt etwas anpassen.

Code:
package read_files;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class Zeilenzaehler{
	
	public void Conversion(String astr_Path)
	{
	               //Zählvariable
                               int zaehler = 0;
				
	               try 
	               { 
	                    BufferedReader lbufre_In = new BufferedReader(new FileReader(astr_Path));
				
	                     String lstr_Line = null;
				   
	                     while((lstr_Line = lbufre_In.readLine()) != null)
		     { 
		            if(lstr_Line.equals("") != true)
                                            {
                                                  zaehler++;
                                            } 
                                            else
                                            {
                                                  System.out.println("Hier ist eine Leerzeile");
                                            }
		     }
		     lbufre_In.close(); 
		}
		catch (FileNotFoundException e)
		{
			System.out.println("File not found!");  
		}
		catch (IOException e)
		{ 
			System.out.println("Error!"); 
		} 

                                System.out.println("Die angegebene Datei hat " + zaehler + " Zeile(n)!");
 
	}
}

Wie gesagt, dass hab ich jetzt aus dem Kopf geschrieben und nicht debuggt. Musst du mal probieren und gegebenenfalls noch anpassen. Du kannst es auch ganz anders lösen, aber das ist ja deinem ähnlich.

Viel Spass noch!

Max
 
Zurück