Problem mit java.util.scanner: Falsche Ergebnisse

Status
Nicht offen für weitere Antworten.

Düark

Aktives Mitglied
Hi, ich habe folgendes Problem:
Meine Klasse soll C-Quellcode parsieren und die jeweiligen Positionen der Keywords rausfinden, die dann weiterverarbeitet werden. Dafür hab ich einen Scanner geschrieben: die Methode

Code:
	public void highlight() {
		if (styledText == null) {
			return;
		}
		if (oldText == null || (!oldText.equals(styledText.getText()))) {
			// we have new text to scan!
			oldText = styledText.getText();
			styleRanges.clear();
			Scanner scanner = new Scanner(oldText);
			scanner.useDelimiter(PatternFactory.getDelimiterPattern());
			String matchstring;
			MatchResult matchresult;
			int iStart, iLength;
			int iCommentStart = 0, iCommentRange = 0;
			boolean bInClosedComment = false;

			while (scanner.hasNext()) {
				try {
					if (!bInClosedComment) {
						// check if we got a linecomment
						if (scanner.hasNext(patLineComment)) {
							matchstring = scanner.next(patLineComment);
							matchresult = scanner.match();
							iCommentStart = matchresult.start();
							iCommentRange = matchstring.length();
							// skip the rest of the line
							matchstring = scanner.nextLine();
							iCommentRange += matchstring.length();
							
							styleComment(iCommentStart, iCommentRange);
					
							iCommentStart = 0;
							iCommentRange = 0;
						}
						// Check if we got a closed comment
						else if (scanner.hasNext(patClosedCommentStart)) {
							bInClosedComment = true;
							matchstring = scanner.next(patClosedCommentStart);
							matchresult = scanner.match();
							iCommentStart = matchresult.start();
							// check if comment ends in this match
							if (matchstring.contains("*/")) {
								iCommentRange = getCommentLength(matchstring);
								styleComment(iCommentStart, iCommentRange);
								bInClosedComment = false;
								iCommentRange = 0;
								iCommentStart=0;
							}
						}
						// check if we got a keyword
						else if (scanner.hasNext(patKey)) {
							matchstring = scanner.next(patKey);
							matchresult = scanner.match();	
							iStart = matchresult.start();	
							iLength = matchstring.length();
							styleKeyword(iStart, iLength);								
							
						} else {
							// check if we got a number
							if (scanner.hasNext(patNumber)) {
								matchstring = scanner.next(patNumber);
								matchresult = scanner.match();
								iStart = matchresult.start();
								iLength = matchstring.length();
								
								styleNumber(iStart, iLength);
								
							} else {
								// discard token if we found nothing
								scanner.next();
							}
						}
					}// !bInClosedComment
					else if (scanner.hasNext(patClosedCommentEnd)) {
						// we are in comment block, check for an '*/'
						matchstring = scanner.next(patClosedCommentEnd);
						matchresult = scanner.match();
						iCommentRange = getCommentLength(matchstring) - iCommentStart;
						
							styleComment(iCommentStart, iCommentRange);
						
						iCommentRange = 0;
						iCommentStart = 0;
						bInClosedComment = false;
					} else {
						// no comment-end, skip token
						scanner.next();
					}

				} catch (Exception e) {
					e.printStackTrace();
				}
			}
			scanner.close();
		}
	}

Die Regex-Pattern werden hier erzeugt:
Code:
import java.util.regex.Pattern;

public class PatternFactory {

	// The patterns we need to search for
	private static Pattern patKey = null;
	private static Pattern patNumber = null;
	private static Pattern patClosedCommentStart = null;
	private static Pattern patClosedCommentEnd = null;
	private static Pattern patLineComment = null;
	private static Pattern patDelimiter=null;
	// C++ Keywords
	private static String[] keywords = { "asm", "auto", "bool", "break",
			"case", "catch", "char", "class", "const", "const_cast",
			"continue", "default", "delete", "do", "double", "dynamic_cast",
			"else", "enum", "explicit", "export", "extern", "false", "float",
			"for", "friend", "goto", "if", "inline", "int", "long", "mutable",
			"namespace", "new", "operator", "private", "protected", "public",
			"register", "reinterpret_cast", "return", "short", "signed",
			"sizeof", "static", "static_cast", "struct", "switch", "template",
			"this", "throw", "true", "try", "typedef", "typeid", "typename",
			"union", "unsigned", "using", "virtual", "void", "volatile",
			"wchar_t", "while", "endif", "include", "ifndef"};

	// Regex source strings 
	private static String numbers = "[0-9]*";
	private static String closedcommentstart = "/\\*.*";
	private static String closedcommentend = ".*\\*/";
	private static String linecomment = "//.*";
	private static String delimiter="[|&+\\-%(){}=;\\n\\t ]";

	// private constructor, nothing to intanciate
	private PatternFactory() {
	}

	/**
	 * Returns the keyword pattern
	 * 
	 * @return
	 */
	public static Pattern getKeywordPattern() {
		if (patKey == null) {
			// Prepare keywords with regex
			StringBuilder sb = new StringBuilder();
			for (int x = 0; x < keywords.length; x++) {
				// Before and after a keyword, everything except characters is
				// allowed
				sb.append("[^a-zA-Z]*");
				sb.append(keywords[x]);
				sb.append("[^a-zA-Z]*");
				if (x <= keywords.length) {
					sb.append("|");
				}
			}
			patKey = Pattern.compile(sb.toString());
		}
		return patKey;
	}

	/**
	 * Returns the delimiter pattern
	 * 
	 * @return
	 */
	public static Pattern getDelimiterPattern()
	{
		if(patDelimiter == null)
		{
			patDelimiter = Pattern.compile(delimiter);
		}
		return patDelimiter;
	}
	
	/**
	 * Returns the Number pattern
	 * 
	 * @return
	 */
	public static Pattern getNumberPattern() {
		if (patNumber == null) {
			patNumber = Pattern.compile(numbers);
		}
		return patNumber;
	}

	/**
	 * Returns the Closed Comment Start pattern
	 * 
	 * @return
	 */
	public static Pattern getClosedCommentStartPattern() {
		if (patClosedCommentStart == null) {
			patClosedCommentStart = Pattern.compile(closedcommentstart);
		}
		return patClosedCommentStart;
	}

	/**
	 * Returns the closed comment end pattern
	 * 
	 * @return
	 */
	public static Pattern getClosedCommentEndPattern() {
		if (patClosedCommentEnd == null) {
			patClosedCommentEnd = Pattern.compile(closedcommentend);
		}
		return patClosedCommentEnd;
	}

	/**
	 * Returns the line comment pattern
	 * 
	 * @return
	 */
	public static Pattern getLineCommentPattern() {
		if (patLineComment == null) {
			patLineComment = Pattern.compile(linecomment);
		}
		return patLineComment;
	}
}
Das wichtige ist, das ich die jeweilige Position und die Länge rauskriege, die ich dann in den Methoden styleNumber oder styleKeyword weiterverwende.
Mein Problem:
Bei kürzeren Quellcodes also z.B. ein HelloWorld-Programm oder auch etwas länger funktioniert das einwandfrei.
Nur ab einer bestimmten Länge, die ich nicht fest sagen kann, liefert der Scanner Unsinn, bzw. sagt mir dass das Matchresult beispielsweise an Position 1 steht, obwohl es an 2000 oder so stehen müsste. (z.B. in Zeile 55 im ersten Codefragment). Hab die Vermutung, dass er wieder von vorne anfängt zu zählen.
Hat jemand von euch schonmal ähnliches erlebt oder weiß, woran es liegen könnte?

Gruss

Dirk
 
S

SlaterB

Gast
poste doch auch einen Beispieltext, bei dem der Fehler auftritt
 

Düark

Aktives Mitglied
z.b. dieser hier... ein Zeichen weniger, und es geht...

Code:
int if_then_wob_same_line(int i)
{
	if( i == 1) return 0;
			
		return 1;	
}


int if_then_wob_next_line(int i)
{
	if( i == 1)
		 return 0;
		 
		return 1;	
}


int if_then_same_line(int i)
{
	if( i == 1) { return 0; }
		
		return 1;	
}

int if_then_next_line(int i)
{
	if( i == 1){
		 return 0;
		}
		
		return 1;	
}


int if_then_brace_next_line(int i)
{
	if( i == 1)
	{
	 return 0;
	}
	return 1;	
}

int if_then_else(int i)
{
	if ( i == 1){
			return 0;
		}
		else
			{
				return 1;
			}
}

int if_empty(int i)
{
	if ( i==1)
		{
			;
		}
		
		return 0;
}

int if_multiple_lines(int i)
{
	if ( i==1 ||
		i==2 ||
		i==3)
			return 1;
		
		else{
			return 0;
		}
	}
	
	int if_if(int i)
	{
		if( i== 1)
			{
				if(i == 2)
					{
						;
					}
			}
			return 0;
	}
	
int if_elseif_same_line(int i)
{
	if(i == 1)
		{
			return 0;
		}
		else if(i==2)
			{
				return 1;
			}
			else if(i ==3) return 3;
				else{
			return 47;
		}
}

void switch_multi (int z, 
int x, 
int y)
{
	switch (x) {
		
		default:
			
		blabla

also das letzte a von blabla weg und es funzt...
Stimmt vielleicht was mit den Regex nicht?

gruss dirk
 
S

SlaterB

Gast
so, als nächstes sehe ich keine main-Operation in deinem Programm,
einer der Code-Blöcke ist auch keine ganze Klasse,

falls du auf jemanden wartest der das im Kopf analysiert,
dann bin ich wohl falsch, sorry ;)
 

Düark

Aktives Mitglied
Natürlich gibts keine main-Funktion, weil das nur ein Auszug aus >10000 zeilen ist ;)
Deswegen ist die Klasse auch nicht vollständig sondern nur die Scanner-Operation, wo aber alles drin ist, was damit zu tun hat.

Ich hatte auch nicht erwartet, dass das jetzt jemand Schritt für Schritt durchstept, sondern nur auf Tips gehofft, wie z.B. "Deine Regex sind murks" oder "So wie du den Scanner benutzt kann dat nicht gehen!"

Gruss

Dirk
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Java modul Problem Allgemeine Java-Themen 4
urmelausdemeis Exception in thread "main" java.lang.Error: Unresolved compilation problem: Allgemeine Java-Themen 7
xGh0st2014 Problem mit Java Array Allgemeine Java-Themen 1
J Problem beim Umstellen auf Java jdk 13 Allgemeine Java-Themen 3
J Problem bei Install java 13 Allgemeine Java-Themen 3
A Problem beim öffnen von Java-Installern Allgemeine Java-Themen 1
B Problem zu einem Java Projekt Allgemeine Java-Themen 6
S Java OpenOffice Problem mit Windows-Benutzerwechsel Allgemeine Java-Themen 19
C J2V8 NodeJs Java Bride Problem und Frage!?!? Allgemeine Java-Themen 1
Blender3D Java Swing Programm Windows 10 Autostart Problem Allgemeine Java-Themen 2
F Java Mail Problem: Authentifizierung wird nicht immer mitgeschickt Allgemeine Java-Themen 1
Seikuassi Input/Output Java transferTo ByteArrayOutputStream-Problem Allgemeine Java-Themen 4
K Problem: Java-Klasse mit mehreren Threads als eigenen Prozess starten Allgemeine Java-Themen 3
B Best Practice Java Zugriffsrechte Problem Allgemeine Java-Themen 2
B Java Zahlenausgabe Problem Allgemeine Java-Themen 6
N Problem mit Java Sperrlisten Allgemeine Java-Themen 0
F Java Spiel Sprung problem Allgemeine Java-Themen 5
G JavaFX Problem nach Update auf Java 8 Allgemeine Java-Themen 0
S Java Problem bei der Rückgabe eines Arrays Allgemeine Java-Themen 19
M Problem mit (etwas komplizierterem) Java Programm Allgemeine Java-Themen 14
W Java Logging Problem Allgemeine Java-Themen 3
K java problem Allgemeine Java-Themen 5
B java.io.IOException: Problem reading font data. Allgemeine Java-Themen 9
H Problem mit Java Generics Allgemeine Java-Themen 6
P Eclipse Java Native Interface-Problem Allgemeine Java-Themen 8
I Java als Dienst Problem Allgemeine Java-Themen 2
F Problem mit Java 7 und Proguard Allgemeine Java-Themen 6
L Input/Output Java und CMD Problem Allgemeine Java-Themen 3
C Java Server Pages Problem Allgemeine Java-Themen 6
M Lego Nxt und Java Problem Allgemeine Java-Themen 8
S Perfomance Problem mit Java Applikation Allgemeine Java-Themen 4
G Problem Java Mail API: CC wird nicht berücksichtigt Allgemeine Java-Themen 7
P Problem mit Java Web Start Allgemeine Java-Themen 1
J Eclipse Java Build Path / Java Problem??? Allgemeine Java-Themen 13
B USB-I2C Adapter JAVA problem Allgemeine Java-Themen 6
D Problem mit java.sql.Timestamp Allgemeine Java-Themen 2
L Problem mit Hintergrund bei JAVA Applet Allgemeine Java-Themen 27
D Problem mit Java version? Allgemeine Java-Themen 4
P Zip Problem in Java Allgemeine Java-Themen 4
N Kleines nicht java Problem Allgemeine Java-Themen 7
G Problem mit RSA Verschlüsselung bei .net und Java Allgemeine Java-Themen 1
Chris81T Performance Problem durch mehrfaches Starten eines JAVA Prog Allgemeine Java-Themen 8
V Java heap space Problem Allgemeine Java-Themen 8
T Problem: eclipse / Java / cyrillisch Allgemeine Java-Themen 4
S Java 5/6 Problem im Classpath Allgemeine Java-Themen 11
F Problem mit Java Listen Allgemeine Java-Themen 4
M Java applet zusammen mit DHTML z-index Problem Allgemeine Java-Themen 2
G problem mit java-editor Allgemeine Java-Themen 4
H Problem mit Java (dsound.dll) Allgemeine Java-Themen 5
E Java.net und Thread-Problem Allgemeine Java-Themen 2
S Problem mit backreference mit java und regex Allgemeine Java-Themen 7
L WindowsTrayIcon in Java 1.4 - Problem beim ausführen der JAR Allgemeine Java-Themen 2
C Java Batch Warte Problem Allgemeine Java-Themen 4
P Java Acces Datenbank Problem ! (Brauche eine Abfrage) Allgemeine Java-Themen 5
G Java-Problem mit Netbeans Allgemeine Java-Themen 2
J Problem mit Java Multimedia Framework Allgemeine Java-Themen 6
G Problem mit Java Fenstern Allgemeine Java-Themen 2
T Problem RSA-Algorithmus in Java? Allgemeine Java-Themen 2
B java problem - speichern Allgemeine Java-Themen 9
G Problem mit java.lang.reflect.Field Allgemeine Java-Themen 15
G java! Problem mit Chat-Applet Allgemeine Java-Themen 3
S Problem beim Bearbeiten von Java-Dateien unter Linux Allgemeine Java-Themen 3
R Browser-Problem nach Java-Update Allgemeine Java-Themen 9
D (gelöst) Java-Problem bei freemind mit fedora core 4 Allgemeine Java-Themen 9
G Java Server Faces - Problem Allgemeine Java-Themen 2
L-ectron-X Problem mit Collections.sort() mit Java 1.5 Allgemeine Java-Themen 9
C Hilfe! Java Control Panel & Limewire Problem! Allgemeine Java-Themen 3
A Probleme bei der Berechnung von Pi! Java Problem Allgemeine Java-Themen 2
G jTable-Problem --> java.lang.OutOfMemoryError Allgemeine Java-Themen 5
T JAVA+SQL=Mysteriöses Problem Allgemeine Java-Themen 3
P java exe erstellen problem Allgemeine Java-Themen 3
N Java Problem mit WIN ME Allgemeine Java-Themen 2
krgewb Problem mit Umlauten und Eszett bei InputStream Allgemeine Java-Themen 3
Max246Sch Backtracking Problem Box Filler Allgemeine Java-Themen 6
NightVision402 VisualVM Startskript Problem Allgemeine Java-Themen 3
javaBoon86 Email Server Connection Problem Allgemeine Java-Themen 1
F Problem mit PDFBOX Library Allgemeine Java-Themen 1
D Read JSON File Problem Allgemeine Java-Themen 9
J Problem mit JasperReports Allgemeine Java-Themen 8
M log4j Problem mit jlink Allgemeine Java-Themen 19
8u3631984 Problem beim Mocken von Record Klassen Allgemeine Java-Themen 4
torresbig Website login Problem - Jsoup, wie bisher, klappt nicht! Allgemeine Java-Themen 31
P Selenium . getText Problem Allgemeine Java-Themen 9
A Jar zu Exe Problem Allgemeine Java-Themen 13
sserio Variablen Liste erstellt und ein Problem mit dem Index Allgemeine Java-Themen 6
S Folgendes Problem bei einem Programm Allgemeine Java-Themen 1
stormyark Problem beim Klassen erstellen Allgemeine Java-Themen 1
A Thread.sleep Problem Allgemeine Java-Themen 2
A Problem bei der Nachbarschafttest Allgemeine Java-Themen 11
Splayfer Problem: no main manifest attribute Allgemeine Java-Themen 3
G javamail Problem beim Empfangen von Nachrichten Allgemeine Java-Themen 3
Splayfer JDA Problem mit MessageCounter Allgemeine Java-Themen 0
Splayfer Problem mit BufferedWriter Allgemeine Java-Themen 3
F Streams als Alternative für dieses Problem ? Allgemeine Java-Themen 15
N Maven Problem mit Datenbanktreiber (H2 Embedded) Allgemeine Java-Themen 12
T Problem beim Umwandeln in eine Jar-Datei Allgemeine Java-Themen 3
B Einfach Elemente zweier Arraylisten kreuz und quer vergleichen, min und max Problem? Allgemeine Java-Themen 16
C ArrayList Problem Allgemeine Java-Themen 3
kev34 nim-Spiel problem Allgemeine Java-Themen 1
D Firebase retrieve data Problem, Child Element wird nicht angesprochen Allgemeine Java-Themen 0

Ähnliche Java Themen

Neue Themen


Oben