Re: Formelparser
- From: "Immo Landwerth" <mail_ignored@xxxxxx>
- Date: Wed, 18 Jan 2006 10:19:50 -0800
Dave wrote:
> > Die für Dich relevanten Begriffe sind Lexer (auch
> > Scanner oder Tokenizer genannt), Recursive Descent Parser (RDP),
> > Abstract Syntax Tree (AST) und Expression Parsing.
>
> Die Begriffe sind mir ein Begriff
Gute Ausgangslage :-)
> > Vereinfacht gesagt brauchst Du zunächst zwei Klassen. Eine zerlegt
> > die Eingabe in Wörter (Tokens).
>
> Hier beginnts: Ich entwerfe gerade ein Interface für diese Tokens ->
> Stichwort Abflussbaum... Gehe ich den richtigen Weg???
Abflussbaum? Klingt eher nach einem Fall für den Klempner ;-)
Den Begriff kenn ich aus dem Compilerbau so nicht; meinst Du vielleicht
einen Kontrollflussbaum (Control Flow Tree, Control Flow Graph) oder
doch den AST? Der Control Flow Graph wäre eher im Bereich des Emittens
und dient dem Erzeugen von optimierten Zwischencode (SSA etc). Daher
nehme ich einfach mal an, dass Du den AST meinst.
Der Begriff Token ist leider auch im Compilerbau relativ überladen.
Normalerweise wird er nur im Bereich der lexikalischen Analayse
verwendent. In .NET wird mit Token aber z.B. auch eine Metadaten Token
bezeichnet.
Wenn es Dir nur um das Design von Tokens im Bereich der lexikalischen
Analyse geht, hat es mit dem AST aber eigentlich gar nichts mehr zu
tun. Ein Token ist ein Wort in der Eingabe, dem vom Lexer in der Regel
eine Klasse (Literal, Bezeichner, Operator, Schlüsselwort, etc) und
einen Wert (z.B. der Name des Bezeichnes) zugeordnet bekommt.
Das schaut dann in etwa so aus:
enum TokenId
{
Eof,
Identifier,
IntegerLiteral,
DoubleLiteral,
If,
Then,
Else,
End
}
class Token
{
public TokenId TokenId;
public string Text;
}
Für komplexere Sprachen (C#, VB) wird häufig der Text selbst nicht im
Token gespeichert, sondern das Token enthält nur Referenzen auf das
Dokument. Das verhindert das (häufig unnütze) Erzeugen von tausenden
von Strings. Für Formeln wäre das aber Overkill.
Für besseres Error Reporting wird i.d.R. noch der Source Context
(Datei, Zeile, Spalte) im Token gespeichert.
Im AST werden i.d.R. keinen Tokens mehr referenziert, da sie dort keine
Bedeutung mehr haben. Da die meisten Sprachen aber auf Grund des Error
Reportings oder eine besonders intelligenten IDE Integration auch einen
Source Context im AST brauchen, wird machnmal Start- und Endeindex der
abgedeckten Tokens an den Knoten gespeichert (was natürlich voraussetzt
das man die Liste der Tokens vom Lexer über einen Index adressieren
kann).
> > Die andere Klasse kombiniert die Wörter dann zu Sätzen. Diese Klasse
> > wird nahezu immer Parser gennant. Der Parser produziert i.d.R. einen
> > Baum (Abstract Syntax Tree, AST), der den Ausdruck bzw. die
> > Anweisung, Deklaration o.ä. representiert.
>
> Okay - kenn ich bereits von meinem BF Interpreter (der am ende sogar
> ASM Code generiert hat stolz)
BrainF***? *vbg* Wollte ich auch schon mal gemacht haben, aber
irgendwie habe ich keine Lust Code in BF zu schreiben ;-)
--
Immo Landwerth - Visual Studio 2003 - C# - XanaNews 1.17.6.6
.
- Follow-Ups:
- Re: Formelparser
- From: Dave
- Re: Formelparser
- References:
- Formelparser
- From: Dave
- Re: Formelparser
- From: Immo Landwerth
- Re: Formelparser
- From: Dave
- Formelparser
- Prev by Date: RTF Control Maximal Textlänge
- Next by Date: Re: Restore einer Datenbank nach open sqlConnection
- Previous by thread: Re: Formelparser
- Next by thread: Re: Formelparser
- Index(es):
Relevant Pages
|