Forum: Algorithmen, Datenstrukturen und Klassendesign
by Medium,
13. Apr 2012
Ja, er sucht mittels Pos(), also aktiv. Zudem gibt mir mein FindToken() den ersten Operator zurück, der nicht in Klammern steht, jap. Wird kein OP ausserhalb von Klammern gefunden, fällt meine If-Then-Wurst in einen Zweig if (s = '(') and (s = ')') then result := Parse(copy(s, 2, Length(s)-2)); durch.
Ich hab mit der Technik jetzt ziemlich alle trivialen Dinge abgedeckt: "Normale" Operatoren...
Forum: Algorithmen, Datenstrukturen und Klassendesign
by Medium,
13. Apr 2012
Doch das geht prima, weil man den "/" eher erkennt als das "-" (Punktrechnung vor Strichrechnung).
So in etwa:
function Parse(s: String): TParseTreeNode;
begin
if s = '-' then s := '0'+s;
if FindToken('*', s) then
result := TParseTreeNode.Create(opMul, Parse(PartBeforeToken('*', s)), Parse(PartAfterToken('*', s)))
else
Forum: Algorithmen, Datenstrukturen und Klassendesign
by Medium,
13. Apr 2012
Beim rekursiven parsen in einen Grammatikbaum (Term von aussen nach innen) weiss der Parser, dass er eine eckige Klammer betreten hat wenn er deren Inhalt weiter zerlegt, und kann entsprechend andere Regeln anwenden, die in diesem Fall z.B. das Look-Ahead unnötig machen (keine Floats in Mengen zulässig).
Die gleiche Vorgehensweise erlaubt auch das Behandeln von "-". Nehme ich den Term "2--X"...