aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
author_ov4 <ov4@ov4.org>2026-10-13 03:23:52 +0000
committer_ov4 <ov4@ov4.org>2026-10-13 03:23:52 +0000
commitf9a0c7e9687bc3e113f4c8f44861533c9ca48b3a (patch)
tree5d51c5a403dd096b0c3748118409be20eb3e1900 /lib
parent3818460a473bd3ffcd35f09eb6429e1b0f00bc07 (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.cc4
-rw-r--r--lib/Lexer/Lexer.cc64
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;
}