Frage

Ich möchte die implementieren Shunging-Yard-Algorithmus, Aber ich brauche Hilfe, um herauszufinden, wie der beste Weg ist, eine Schnur in seine Token aufzuteilen.

Wenn Sie es bemerken, lautet der erste Schritt des Algorithmus "Lesen Sie ein Token". Dies ist nicht gerade eine nicht triviale Sache. Token können aus Zahlen, Operatoren und Parens bestehen.

Wenn Sie so etwas wie:

(5+1)

Ein einfacher String.split () gibt mir ein Array der Token {"(", "5", "+", "1", ")"}.

Es wird jedoch komplizierter, wenn Sie Zahlen mit mehreren Ziffern haben, wie z. B.:

((2048*124) + 42)

Jetzt wird eine naive String.split () den Trick nicht tun. Die mehrstelligen Zahlen sind ein Problem.

Ich weiß, ich könnte einen Lexer schreiben, aber gibt es eine Möglichkeit, dies zu tun, ohne einen ausgewachsenen Lexer zu schreiben?

Ich implementiere dies in JavaScript und ich möchte vermeiden, wenn möglich auf den Lexer-Pfad gehen zu müssen. Ich werde die "*", "+", "--" und "/" Operatoren zusammen mit Ganzzahlen verwenden.

War es hilfreich?

Lösung

Wie wäre es mit regulären Ausdrücken? Sie können regex problemlos schreiben, um sie so aufzuteilen, wie Sie es möchten, und die JS -String.Split -Methode akzeptiert auch Regex als Parameter.

Zum Beispiel ... (ändern Sie alle Zeichen, die Sie benötigen usw.)

/([0-9]+|[*+-\/()])/

Andere Tipps

Sie können eine globale Übereinstimmung wie beschrieben bei verwenden http://mikessamuel.blogspot.com/2009/05/efficy-parsing-in-javascript.html

Grundsätzlich erstellen Sie einen Regex, der ein Token beschreibt

/[0-9]+|false|true|\(|\)/g

und setzen Sie das 'g' am Ende, damit es weltweit übereinstimmt, und dann nennen Sie seine Match -Methode

var tokens = myRegex.match(inputString);

Und holen Sie sich ein Array zurück.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top