Hi,
Ich arbeite gerade daran einen Taschenrechner zu erstellen,
dabei hab Ich jetzt Probleme den Syntaxbaum aufzubauen, also Ich hab die Lexikalische Analyse fertig implementiert, folgende Terminale sind gegeben:
ADD,
SUB,
MUL,
DIV,
BROPEN,
BRCLOSE,
INTNUM,
DECNUM,
ID,
Die Regeln hab ich erstmal nur die grundrechenarten ohne Klammern und bezeichner.
START -> NUMBER TERM
OPERATOR -> add | sub | mul | div
NUMBER -> decnum | intnum
TERM -> OPERATOR START | EMPTY
Jetzt weiß Ich nicht wie Ich vorgehen soll, um die vorliegenden Token in so eine Baum-Struktur zu kriegen, ich hab 3 Klassen modelliert:
und
Habe schon einiges ausprobiert gehabt, das meiste was mir Probleme bereit hat, war die Überprüfung welche der Definitionen nun genommen werden soll damit kein Stackoverflow entsteht (also rekursiv hab Ich den Baum befüllt), wie bei TERM und START, weil das ja mit der Eingabe zusammenhängt und den Algorithmus dafür krieg Ich nicht so recht hin, wäre gut wenn mir jemand helfen könnte.
Der betreffende Teil ist in Form1.cs im Konstruktur
Die Projektmappe ist im Anhang.
Ich arbeite gerade daran einen Taschenrechner zu erstellen,
dabei hab Ich jetzt Probleme den Syntaxbaum aufzubauen, also Ich hab die Lexikalische Analyse fertig implementiert, folgende Terminale sind gegeben:
ADD,
SUB,
MUL,
DIV,
BROPEN,
BRCLOSE,
INTNUM,
DECNUM,
ID,
Die Regeln hab ich erstmal nur die grundrechenarten ohne Klammern und bezeichner.
START -> NUMBER TERM
OPERATOR -> add | sub | mul | div
NUMBER -> decnum | intnum
TERM -> OPERATOR START | EMPTY
Jetzt weiß Ich nicht wie Ich vorgehen soll, um die vorliegenden Token in so eine Baum-Struktur zu kriegen, ich hab 3 Klassen modelliert:
C#-Quellcode
- public class SyntaxTree<T>
- {
- public SyntaxTree(T pValue, params SyntaxTree<T>[] pNode)
- {
- this.Value = pValue;
- this.Nodes = pNode.ToList();
- }
- public SyntaxTree(T pValue)
- {
- this.Value = pValue;
- this.Nodes = new List<SyntaxTree<T>>();
- }
- public T Value { get; private set; }
- public List<SyntaxTree<T>> Nodes { get; set; }
- }
und
C#-Quellcode
- public class Grammar
- {
- public Grammar(string pLeft, params MultipleValue[] pValues)
- {
- LeftValue = pLeft;
- RightValue = pValues;
- }
- public string LeftValue { get; private set; }
- public MultipleValue[] RightValue { get; private set; }
- public bool Contains(string pValue, ref MultipleValue pVal, int pIndex)
- {
- foreach (var item in RightValue)
- {
- foreach (var elem in item.Values)
- {
- if (elem == pValue)
- {
- pVal = item;
- if (pIndex == 0)
- return true;
- pIndex--;
- }
- }
- }
- return false;
- }
- }
- public class MultipleValue
- {
- public MultipleValue(params string[] pValues)
- {
- this.Values = pValues;
- }
- public string[] Values { get; private set; }
- }
Habe schon einiges ausprobiert gehabt, das meiste was mir Probleme bereit hat, war die Überprüfung welche der Definitionen nun genommen werden soll damit kein Stackoverflow entsteht (also rekursiv hab Ich den Baum befüllt), wie bei TERM und START, weil das ja mit der Eingabe zusammenhängt und den Algorithmus dafür krieg Ich nicht so recht hin, wäre gut wenn mir jemand helfen könnte.
Der betreffende Teil ist in Form1.cs im Konstruktur
Die Projektmappe ist im Anhang.