From 1c5cadd26349e88bdaf0423727415d3bf2f7aa1e Mon Sep 17 00:00:00 2001 From: Ethan Girouard Date: Tue, 2 Sep 2025 10:22:55 -0400 Subject: [PATCH] Use text for member access instead of Expr --- src/Windows12/Ast.hs | 2 +- src/Windows12/CodeGen.hs | 4 ++-- src/Windows12/Parser.hs | 10 ++++++++-- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/Windows12/Ast.hs b/src/Windows12/Ast.hs index 39b0dc7..8af3f5b 100644 --- a/src/Windows12/Ast.hs +++ b/src/Windows12/Ast.hs @@ -60,7 +60,7 @@ data Expr | UnOp UnOp Expr | Call Expr [Expr] | Index Expr Expr - | Member Expr Expr + | Member Expr Text | Cast Type Expr | Sizeof Type | StructInit Text [(Text, Expr)] diff --git a/src/Windows12/CodeGen.hs b/src/Windows12/CodeGen.hs index c245bae..06a1f16 100644 --- a/src/Windows12/CodeGen.hs +++ b/src/Windows12/CodeGen.hs @@ -108,7 +108,7 @@ codegenLVal (Id name) = do Nothing -> error $ "Variable " ++ show name ++ " not found" -- TODO support members of members -codegenLVal (Member (Id sName) (Id field)) = do +codegenLVal (Member (Id sName) field) = do ctx <- get case lookup sName (operands ctx) of Just ((Just (StructType op_type)), struct) -> do @@ -202,7 +202,7 @@ codegenExpr (Call (Id f) args) = do codegenExpr (Index arr idx) = undefined -- TODO arrays -- Get the address of the struct field and load it -codegenExpr (Member (Id sVarName) (Id field)) = do +codegenExpr (Member (Id sVarName) field) = do ctx <- get case lookup sVarName (operands ctx) of Just ((Just (StructType op_type)), struct) -> do diff --git a/src/Windows12/Parser.hs b/src/Windows12/Parser.hs index 46ccf7d..8b3c2f8 100644 --- a/src/Windows12/Parser.hs +++ b/src/Windows12/Parser.hs @@ -9,8 +9,14 @@ import Windows12.Lexer opTable :: [[Operator Parser Expr]] opTable = - [ [ InfixL $ Member <$ symbol ".", - InfixL $ (\l r -> Member (UnOp Deref l) r) <$ symbol "->" + [ [ Postfix $ do + _ <- symbol "." + field <- identifier + pure (\expr -> Member expr field), + Postfix $ do + _ <- symbol "->" + field <- identifier + pure (\expr -> Member (UnOp Deref expr) field) ], [ unary (UnOp Neg) "-", unary (UnOp Not) "!",