Frage C # Tokenizer - die Trennzeichen beibehalten [duplizieren]


Diese Frage hat hier bereits eine Antwort:

Ich arbeite an der Portierung von Code von JAVA zu C #, und ein Teil des JAVA-Codes verwendet Tokenizer - aber ich verstehe, dass das resultierende Array aus dem stringtokenizer in Java auch die Trennzeichen (in diesem Fall +, -, /, *) , (,)) als Token. Ich habe versucht, die C # Split () -Funktion zu verwenden, aber es scheint, die Separatoren selbst zu beseitigen. Am Ende wird dies eine Zeichenfolge analysieren und als eine Berechnung ausführen. Ich habe viel recherchiert und keine Referenzen zu diesem Thema gefunden.

Weiß jemand, wie man die tatsächlichen Trennzeichen in der Reihenfolge, in der sie aufgetreten sind, in das geteilte Array bringt?

Code für das Token-icing:

public CalcLexer(String s)
{
    char[] seps = {'\t','\n','\r','+','-','*','/','(',')'};
    tokens = s.Split(seps);
    advance();
}

Testen:

static void Main(string[] args)
    {
        CalcLexer myCalc = new CalcLexer("24+3");
        Console.ReadLine();
    }

Die "24 + 3" würde folgende Ausgabe ergeben: "24", "3" Ich suche eine Ausgabe von "24", "+", "3"

Aufgrund der vollständigen Offenlegung ist dieses Projekt Teil einer Klassenzuweisung und verwendet den folgenden vollständigen Quellcode:

http://www.webber-labs.com/mpl/source%20code/Chapter%20Seventeen/CalcParser.java.txt http://www.webber-labs.com/mpl/source%20code/Chapter%20Seventeen/CalcLexer.java.txt


5
2017-07-15 21:52


Ursprung


Antworten:


Sie können verwenden Regex.Split mit Assertionen mit der Breite null. Zum Beispiel wird Folgendes aufgeteilt +-*/:

Regex.Split(str, @"(?=[-+*/])|(?<=[-+*/])");

Effektiv sagt das, "spaltet sich an diesem Punkt, wenn ihm eines folgt oder vorausgeht -+*/. Die abgeglichene Zeichenkette selbst hat die Länge Null, so dass Sie keinen Teil der Zeichenkette verlieren.


12
2017-07-15 22:04



Dies erzeugt deine Ausgabe:

string s = "24+3";
string seps = @"(\t)|(\n)|(\+)|(-)|(\*)|(/)|(\()|(\))";
string[] tokens = System.Text.RegularExpressions.Regex.Split(s, seps);

foreach (string token in tokens)
    Console.WriteLine(token);

4
2017-07-15 22:08



Wenn Sie eine sehr flexible, leistungsfähige, zuverlässige und erweiterbare Lösung wünschen, können Sie die C # -Port von ANTLR. Es gibt einige Initial Overhead (Link ist Setup-Information für VS2008) Das würde wahrscheinlich zu einem Overkill für ein so kleines Projekt führen. Hier ist ein Taschenrechnerbeispiel mit Unterstützung für Variablen.

Wahrscheinlich zu viel für Ihre Klasse, aber wenn Sie daran interessiert sind, etwas über "echte" Lösungen für diese Art von Problemen in der realen Welt zu erfahren, werfen Sie einen Blick darauf. Ich habe sogar eine Visual Studio-Paket zum Arbeiten mit den Grammatikenoder Sie können verwenden ANTLRWorks separat.


1
2017-07-15 22:02