diff options
| author | _ov4 <ov4@ov4.org> | 2026-10-13 03:23:52 +0000 |
|---|---|---|
| committer | _ov4 <ov4@ov4.org> | 2026-10-13 03:23:52 +0000 |
| commit | f9a0c7e9687bc3e113f4c8f44861533c9ca48b3a (patch) | |
| tree | 5d51c5a403dd096b0c3748118409be20eb3e1900 /lib | |
| parent | 3818460a473bd3ffcd35f09eb6429e1b0f00bc07 (diff) | |
feat: compile source files with configurable IR output
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/CodeGen/CodeGen.cc | 4 | ||||
| -rw-r--r-- | lib/Lexer/Lexer.cc | 64 |
2 files changed, 33 insertions, 35 deletions
diff --git a/lib/CodeGen/CodeGen.cc b/lib/CodeGen/CodeGen.cc index fbf807b..903d8ef 100644 --- a/lib/CodeGen/CodeGen.cc +++ b/lib/CodeGen/CodeGen.cc @@ -539,8 +539,8 @@ void CodeGen::compile(const std::vector<std::unique_ptr<StmtAST>> &Statements) { } } -void CodeGen::print() { - TheModule->print(errs(), nullptr); +void CodeGen::print(raw_ostream &Output) { + TheModule->print(Output, nullptr); } Value *CodeGen::emitExpr(ExprAST *Expr) { diff --git a/lib/Lexer/Lexer.cc b/lib/Lexer/Lexer.cc index 4b5acae..6299371 100644 --- a/lib/Lexer/Lexer.cc +++ b/lib/Lexer/Lexer.cc @@ -8,24 +8,22 @@ using namespace cps; int Lexer::gettok() { - static int LastChar = ' '; - while (isspace(LastChar)) { if (LastChar == '\n') CurrentLine++; - LastChar = getchar(); + LastChar = Input.get(); } if (LastChar == '"') { StringVal.clear(); - LastChar = getchar(); + LastChar = Input.get(); while (LastChar != '"' && LastChar != EOF && LastChar != '\n') { StringVal += static_cast<char>(LastChar); - LastChar = getchar(); + LastChar = Input.get(); } if (LastChar == '"') { - LastChar = getchar(); + LastChar = Input.get(); } else { fprintf(stderr, "Error: Unterminated string literal at line %d\n", CurrentLine); HadError = true; @@ -35,7 +33,7 @@ int Lexer::gettok() { } if (LastChar == '\'') { - int CharCode = getchar(); + int CharCode = Input.get(); if (CharCode == EOF || CharCode == '\n') { fprintf(stderr, "Error: Unterminated char literal at line %d\n", CurrentLine); HadError = true; @@ -46,28 +44,28 @@ int Lexer::gettok() { return tok_char_literal; } - int ClosingQuote = getchar(); + int ClosingQuote = Input.get(); if (ClosingQuote != '\'') { fprintf(stderr, "Error: CHAR literal must contain exactly one character (line %d)\n", CurrentLine); HadError = true; while (ClosingQuote != EOF && ClosingQuote != '\n' && ClosingQuote != '\'') { - ClosingQuote = getchar(); + ClosingQuote = Input.get(); } CharVal = static_cast<char>(CharCode); StringVal.assign(1, CharVal); - LastChar = (ClosingQuote == '\'') ? getchar() : ClosingQuote; + LastChar = (ClosingQuote == '\'') ? Input.get() : ClosingQuote; return tok_char_literal; } CharVal = static_cast<char>(CharCode); StringVal.assign(1, CharVal); - LastChar = getchar(); + LastChar = Input.get(); return tok_char_literal; } if (isalpha(LastChar)) { IdentifierStr = static_cast<char>(LastChar); - while (isalnum((LastChar = getchar())) || LastChar == '_') + while (isalnum((LastChar = Input.get())) || LastChar == '_') IdentifierStr += static_cast<char>(LastChar); if (IdentifierStr == "DECLARE") return tok_declare; @@ -143,11 +141,11 @@ int Lexer::gettok() { bool isReal = false; do { NumStr += static_cast<char>(LastChar); - LastChar = getchar(); + LastChar = Input.get(); if (LastChar == '.' && !isReal) { isReal = true; NumStr += '.'; - LastChar = getchar(); + LastChar = Input.get(); } } while (isdigit(LastChar)); @@ -161,55 +159,55 @@ int Lexer::gettok() { } if (LastChar == '<') { - LastChar = getchar(); + LastChar = Input.get(); if (LastChar == '-') { - LastChar = getchar(); + LastChar = Input.get(); return tok_assign; } if (LastChar == '=') { - LastChar = getchar(); + LastChar = Input.get(); return tok_le; } if (LastChar == '>') { - LastChar = getchar(); + LastChar = Input.get(); return tok_ne; } return '<'; } if (LastChar == '>') { - LastChar = getchar(); + LastChar = Input.get(); if (LastChar == '=') { - LastChar = getchar(); + LastChar = Input.get(); return tok_ge; } return '>'; } if (LastChar == '=') { - LastChar = getchar(); + LastChar = Input.get(); return tok_eq; } if (LastChar == ':') { - LastChar = getchar(); + LastChar = Input.get(); return tok_colon; } - if (LastChar == '(') { LastChar = getchar(); return '('; } - if (LastChar == ')') { LastChar = getchar(); return ')'; } - if (LastChar == '[') { LastChar = getchar(); return '['; } - if (LastChar == ']') { LastChar = getchar(); return ']'; } - if (LastChar == ',') { LastChar = getchar(); return ','; } - if (LastChar == '+') { LastChar = getchar(); return '+'; } - if (LastChar == '-') { LastChar = getchar(); return '-'; } - if (LastChar == '*') { LastChar = getchar(); return '*'; } + if (LastChar == '(') { LastChar = Input.get(); return '('; } + if (LastChar == ')') { LastChar = Input.get(); return ')'; } + if (LastChar == '[') { LastChar = Input.get(); return '['; } + if (LastChar == ']') { LastChar = Input.get(); return ']'; } + if (LastChar == ',') { LastChar = Input.get(); return ','; } + if (LastChar == '+') { LastChar = Input.get(); return '+'; } + if (LastChar == '-') { LastChar = Input.get(); return '-'; } + if (LastChar == '*') { LastChar = Input.get(); return '*'; } if (LastChar == '/') { - int NextChar = getchar(); + int NextChar = Input.get(); if (NextChar == '/') { do { - LastChar = getchar(); + LastChar = Input.get(); } while (LastChar != EOF && LastChar != '\n' && LastChar != '\r'); if (LastChar != EOF) @@ -224,6 +222,6 @@ int Lexer::gettok() { return tok_eof; int ThisChar = LastChar; - LastChar = getchar(); + LastChar = Input.get(); return ThisChar; } |
