?
Hi schrieb:
Wie ich bereits geschrieben habe, wird in dem Artikel zwar ein AST beschrieben, jedoch ist dieser so simpel, das das Konzept auf dem er baut (ich les mal das nächste Zeichen ein und schreib das in eine Node) nicht funktioniert, wenn man komplexere Strukturen wie Zuweisungen hat...
Wie bereits gesagt, die Grammatik ist von Pascal übernommen
Je nach Grammatik muss es einfach möglich sein, dass man ein Token im voraus lesen kann. Und dann ist das auch kein Problem mit dem AST.
Ich sehe echt das Problem nicht. Wenn du auf einen Identiefer triffst, dann hast du aufjedenfall schon mal ein Node für den Identifier.
NodeIdent(i)
Wenn du dann auf ein = triffst, hast du eben eine Zuweisung und zwar vom vorher eingelesenen Identifier.
NodeAssignment(NodeIdent(i))
Was dann folgt ist ein Ausdruck. Das sieht dann letztendlich so aus:
NodeAssignment(NodeIdent(i), NodeExpression(NodeOp(*), NodeNumber(12), NodeNumber(14))
Und wenn man die entsprechenden Nodes hat, kann das in C++ auch manuell so angelegt werden:
Node *root = new NodeAssignment(new NodeIdent("i"), new NodeExpression(new NodeOp("*"), new NodeNumber(12), new NodeNumber(14));
root->Evaluate(); // Oder was auch immer
Und ein Funktionsaufruf kann eben auch ein Ausdruck sein...
Was du also brauchst ist:
struct NodeAssignment : public Node
{
NodeIdent *ident;
NodeExpr *expr;
// ...
};
struct NodeExpr : public Node
{
NodeOp *op;
struct NodeExpr *left;
struct NodeExpr *right;
// ...
};
// ...