]> git.deglebe.com Git - barec/barec.git/commitdiff
fix parse assignment
authorThomas Bruce <tdb@tdbio.me>
Wed, 19 Feb 2025 22:05:42 +0000 (17:05 -0500)
committerThomas Bruce <tdb@tdbio.me>
Wed, 19 Feb 2025 22:05:42 +0000 (17:05 -0500)
.gitignore [new file with mode: 0644]
parser.c

diff --git a/.gitignore b/.gitignore
new file mode 100644 (file)
index 0000000..74e79bb
--- /dev/null
@@ -0,0 +1 @@
+next-to-add.c
index 1446792be120405fdfbfe912bf8324903d15fe2e..a02250e906f104b0bf79e19ccdeca81ad411bdd1 100644 (file)
--- a/parser.c
+++ b/parser.c
@@ -99,6 +99,7 @@ static ASTNode* parseAdditive(void);
 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);
@@ -208,7 +209,7 @@ static ASTNode* parseStatement(void) {
 
 /* expression := equality */
 static ASTNode* parseExpression(void) {
-       return parseEquality();
+       return parseAssignment();
 }
 
 /* equality := additive ( "==" additive )* */
@@ -302,6 +303,20 @@ static ASTNode* parseDeclaration(void) {
        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) {