2016-09-20 7 views
-6

Ich habe ein paar, theoretische Ideen, aber ich kenne die Sprache nicht gut. Wir müssen grundsätzlich einen rudimentären lexikalischen Analysator erstellen. Ich habe die meisten Bits, aber hier ist der Kontext. Die direkte Frage ist am Ende.Parsen in Java

Ich brauche in einer Linie von der Konsole zu lesen, dann sehen, ob Teile mit einer Symboltabelle übereinstimmen, die die Schlüsselwörter enthalten: "print [variable]", "load [variable]", "mem [variable]", "sqrt" und "stop" sowie mathematische Symbole.

Es muss auch die Variablen auf eigene Faust erkennen (wie "c = a + b" auch.)

Also ... es ist nicht so schwer, in der Theorie. Sie würden das erste Zeichen der Zeichenfolge überprüfen, das mit Schlüsselwörtern oder Variablen übereinstimmt. Wenn dies der Fall ist, führen Sie einen Durchlauf durch das Schlüsselwort oder die Variable durch, um zu prüfen, ob es sich um die gleiche Zeichenfolge handelt, bis Sie ein Leerzeichen drücken.

Zusammenfassend: Wie überprüfe ich die Zeichen einer eingelesenen Zeichenfolge, um sie mit Sachen in Java zu vergleichen?

+0

'String.charAt()' und 'StringTokenizer' werden Sie starten. – markspace

+0

Ich werde diese zu meinen Notizen hinzufügen. –

Antwort

0

Ich empfehle, Regex für Textmustervergleich zu verwenden. Sie erhalten den Text über die Konsole als Argument, indem Sie das args Array der main-method verwenden. Hier ist ein kleines Beispiel:

public final class Parser { 
    public static void main(final String[] args) { 
     if (args.length < 1) { 
      // Error, no input given 
     } 

     String input = args[0]; 

     Pattern pattern = Pattern.compile("YOUR REGEX HERE"); 
     Matcher matcher = pattern.matcher(input); 

     if (matcher.find()) { 
      // Input matches the Regex pattern 
      // Access to capturing groups using matcher.group(int) 
      // Example: System.out.println(matcher.group(1)); 
     } 
    } 
} 

Für Regex Sie verschiedene Erklärungen im Internet und auf SO finden. Sie können Ihre Muster unter regex101 ausprobieren.

Hier ist ein Beispiel Muster, das "name = Name + Name" entspricht:

(.+) = (.+) \+ (.+) 

Die () einfangenden Gruppen erstellt. Unter Verwendung matcher.group(x) für x von 1 to 3 können Sie auf die übereinstimmenden Werte innerhalb der Klammern zugreifen, d. H. Die Variablen.
Hier ist das gleiche Beispiel online mit Test-Eingang: regex101.com/r/mJ9jI5/1

Ziemlich einfach. Sie müssen jedoch möglicherweise die pattern robuster machen. Es darf keine whitespace Zeichen oder Sonderzeichen (z. B. +) in einem Variablennamen usw. annehmen.

+0

Hmm. Ich mag das. Ich werde die Details am Morgen nachschlagen. Ich schätze es. –