static ASTNode* parseTerm(void);
static ASTNode* parseFactor(void);
static ASTNode* parseDeclaration(void);
+static ASTNode* parseAssignment(void);
static ASTNode* parseStatement(void);
static ASTNode* parseCompoundStatement(void);
static ASTNode* parseFunctionDefinition(void);
/* expression := equality */
static ASTNode* parseExpression(void) {
- return parseEquality();
+ return parseAssignment();
}
/* equality := additive ( "==" additive )* */
return decl;
}
+static ASTNode* parseAssignment(void) {
+ ASTNode * node = parseEquality();
+ if (g_currentToken.kind == TK_ASSIGN) {
+ if (node->kind != AST_IDENT) {
+ fprintf(stderr, "Parse err: left side is not ident.");
+ exit(1);
+ }
+ nextToken();
+ ASTNode* rhs = parseAssignment();
+ node = newBinaryNode(node, rhs, "=");
+ }
+ return node;
+}
+
/* demonstration: ast printing*/
static void printIndent(int indent) {