From 2147449f4d6f37b4624990ff26bce58ebf3cfb4b Mon Sep 17 00:00:00 2001 From: _ov4 Date: Wed, 14 Oct 2026 03:31:47 +0000 Subject: feat(parser): add explicit parenthesized type casts Co-Authored-By: Claude Fable 5.1 --- include/cps/CodeGen.h | 4 ++++ include/cps/Parser.h | 5 +++++ include/cps/TypeAST.h | 10 ++++++++++ 3 files changed, 19 insertions(+) (limited to 'include/cps') diff --git a/include/cps/CodeGen.h b/include/cps/CodeGen.h index acd6cb2..5043417 100644 --- a/include/cps/CodeGen.h +++ b/include/cps/CodeGen.h @@ -20,6 +20,7 @@ namespace cps { class ArrayHandler; class FileHandler; class ExceptionHandler; +class CastExprAST; class CodeGen { std::unique_ptr TheContext; @@ -66,6 +67,9 @@ class CodeGen { bool isWholeArrayVar(ExprAST *Expr) const; const TypeInfo *getExprTypeInfo(ExprAST *Expr) const; llvm::Value *coerceValueToType(llvm::Value *Val, const TypeInfo *TargetInfo); + llvm::Value *convertNumericValue(llvm::Value *Val, const TypeInfo *Source, + const TypeInfo *Target); + llvm::Value *emitCast(CastExprAST *Cast); // TYPE-system helpers (Designator.cc). void runTypePrePass(const std::vector> &Statements); diff --git a/include/cps/Parser.h b/include/cps/Parser.h index 49a9791..5713587 100644 --- a/include/cps/Parser.h +++ b/include/cps/Parser.h @@ -10,6 +10,7 @@ #include #include #include +#include namespace cps { @@ -20,6 +21,10 @@ class Parser { unsigned BlockDepth = 0; // ParseBlock nesting; 1 = top level std::map BinopPrecedence; + std::set TypeNames = { + "INTEGER", "REAL", "BOOLEAN", "STRING", "CHAR", "VOID", + "C_INT", "C_CHAR", "C_STRING", "C_DOUBLE" + }; int getNextToken(); int GetTokPrecedence(); diff --git a/include/cps/TypeAST.h b/include/cps/TypeAST.h index 95c1d6d..873ca4a 100644 --- a/include/cps/TypeAST.h +++ b/include/cps/TypeAST.h @@ -8,6 +8,16 @@ namespace cps { +class CastExprAST : public ExprAST { + std::string TypeName; + std::unique_ptr Operand; +public: + CastExprAST(std::string TypeName, std::unique_ptr Operand) + : TypeName(std::move(TypeName)), Operand(std::move(Operand)) {} + const std::string &getTypeName() const { return TypeName; } + ExprAST *getOperand() const { return Operand.get(); } +}; + // TYPE = C_TYPE("") class CTypeDeclAST : public StmtAST { std::string Name; -- cgit v1.3.1-4-g156e