From 4a61095e39eea66ed507c1fc09a9f1a9d06627c5 Mon Sep 17 00:00:00 2001 From: SimonFJ20 Date: Sat, 11 Feb 2023 19:55:26 +0100 Subject: [PATCH] init --- ' | 36 +++++ :w | 187 ++++++++++++++++++++++++ Makefile | 19 +++ compile_flags.txt | 6 + lexer.c | 353 ++++++++++++++++++++++++++++++++++++++++++++++ lexer.h | 76 ++++++++++ lexer.o | Bin 0 -> 17072 bytes main.c | 3 + main.o | Bin 0 -> 1496 bytes wacc | Bin 0 -> 20744 bytes 10 files changed, 680 insertions(+) create mode 100644 ' create mode 100644 :w create mode 100644 Makefile create mode 100644 compile_flags.txt create mode 100644 lexer.c create mode 100644 lexer.h create mode 100644 lexer.o create mode 100644 main.c create mode 100644 main.o create mode 100755 wacc diff --git a/' b/' new file mode 100644 index 0000000..2ee068e --- /dev/null +++ b/' @@ -0,0 +1,36 @@ +#ifndef LEXER_H +#define LEXER_H + +#include + +typedef enum { + Id, + Int, + Float, + String, + + If, + Else, + While, + Break, + + LParen, + RParen, + LBrace, + RBrace, + + Plus, + Minus, +} TokenType; + +typedef struct { + TokenType type; + size_t index, length; + int line, column; +} Token; + +typedef struct Lexer Lexer; + +void lexer_create(Lexer* lexer, const char* text, size_t text_length); + +#endif diff --git a/:w b/:w new file mode 100644 index 0000000..eb0d0d5 --- /dev/null +++ b/:w @@ -0,0 +1,187 @@ +#include "lexer.h" +#include +#include +#include +#include + +struct Lexer { + const char* text; + size_t index, length; + int line, column; +}; + +Token lexer_skip_whitespace(Lexer* lexer); +Token lexer_make_int(Lexer* lexer); +Token lexer_make_id(Lexer* lexer); +bool lexer_span_matches(const Lexer* lexer, Position begin, const char* value); +Token lexer_make_static(Lexer* lexer); +Token make_single_char_token(Lexer* lexer, TokenType type); +Token make_slash_token(Lexer* lexer); +Token lexer_make_invalid_char(Lexer* lexer); +Position lexer_position(const Lexer* lexer); +Token lexer_token(const Lexer* lexer, TokenType type, Position begin); +bool lexer_done(const Lexer* lexer); +char lexer_current(const Lexer* lexer); +void lexer_step(Lexer* lexer); + +void lexer_create(Lexer* lexer, const char* text, size_t text_length) +{ + *lexer = (Lexer) { + .text = text, + .length = text_length, + .line = 1, + .column = 1, + }; +} + +Token lexer_next(Lexer* lexer) +{ + char c = lexer_current(lexer); + if (lexer_done(lexer)) + return lexer_token(lexer, TokenTypeEof, lexer_position(lexer)); + else if (isspace(c)) + return lexer_skip_whitespace(lexer); + else if (isdigit(c)) + return lexer_make_int(lexer); + else if (isalpha(c) || c == '_') + return lexer_make_id(lexer); + else + return lexer_make_static(lexer); +} + +Token lexer_skip_whitespace(Lexer* lexer) +{ + lexer_step(lexer); + while (!lexer_done(lexer) && isspace(lexer_current(lexer))) + lexer_step(lexer); + return lexer_next(lexer); +} + +Token lexer_make_int(Lexer* lexer) +{ + Position begin = lexer_position(lexer); + lexer_step(lexer); + while (!lexer_done(lexer) && isdigit(lexer_current(lexer))) + lexer_step(lexer); + return lexer_token(lexer, TokenTypeInt, begin); +} + +Token lexer_make_id(Lexer* lexer) +{ + Position begin = lexer_position(lexer); + lexer_step(lexer); + while (!lexer_done(lexer) + && (isalpha(lexer_current(lexer)) || isdigit(lexer_current(lexer)) + || lexer_current(lexer) == '_')) + lexer_step(lexer); + if (lexer_span_matches(lexer, begin, "if")) + return lexer_token(lexer, TokenTypeIf, begin); + else if (lexer_span_matches(lexer, begin, "else")) + return lexer_token(lexer, TokenTypeElse, begin); + else if (lexer_span_matches(lexer, begin, "while")) + return lexer_token(lexer, TokenTypeWhile, begin); + else if (lexer_span_matches(lexer, begin, "break")) + return lexer_token(lexer, TokenTypeBreak, begin); + else + return lexer_token(lexer, TokenTypeId, begin); +} + +bool lexer_span_matches(const Lexer* lexer, Position begin, const char* value) +{ + size_t length = lexer->index - begin.index; + if (length != strlen(value)) + return false; + return strncmp(&lexer->text[begin.index], value, length) == 0; +} + +Token lexer_make_static(Lexer* lexer) +{ + switch (lexer_current(lexer)) { + case '(': + return make_single_char_token(lexer, TokenTypeLParen); + case ')': + return make_single_char_token(lexer, TokenTypeRParen); + case '{': + return make_single_char_token(lexer, TokenTypeLBrace); + case '}': + return make_single_char_token(lexer, TokenTypeRBrace); + case ';': + return make_single_char_token(lexer, TokenTypeSemicolon); + case '+': + return make_single_char_token(lexer, TokenTypePlus); + case '-': + return make_single_char_token(lexer, TokenTypeMinus); + case '*': + return make_single_char_token(lexer, TokenTypeAsterisk); + case '/': + return make_slash_token(lexer); + case '%': + return make_single_char_token(lexer, TokenTypePercent); + default: + return lexer_make_invalid_char(lexer); + } +} + +Token make_single_char_token(Lexer* lexer, TokenType type) +{ + Position begin = lexer_position(lexer); + lexer_step(lexer); + return lexer_token(lexer, type, begin); +} + +Token skip_singleline_comment(Lexer* lexer); +Token skip_multiline_comment(Lexer* lexer); + +Token make_slash_token(Lexer* lexer) +{ + Position begin = lexer_position(lexer); + lexer_step(lexer); + switch (lexer_current(lexer)) { + case '/': + return skip_singleline_comment(lexer); + default: + return lexer_token(lexer, TokenTypeSlash, begin); + } +} + +Token lexer_make_invalid_char(Lexer* lexer) +{ + Position begin = lexer_position(lexer); + lexer_step(lexer); + return lexer_token(lexer, TokenTypeInvalidChar, begin); +} + +Position lexer_position(const Lexer* lexer) +{ + return (Position) { + .index = lexer->index, + .line = lexer->line, + .column = lexer->column, + }; +} + +Token lexer_token(const Lexer* lexer, TokenType type, Position begin) +{ + return (Token) { + .type = type, + .position = begin, + .length = lexer->index - begin.index, + }; +} + +bool lexer_done(const Lexer* lexer) { return lexer->index >= lexer->length; } + +char lexer_current(const Lexer* lexer) { return lexer->text[lexer->index]; } + +void lexer_step(Lexer* lexer) +{ + if (lexer_done(lexer)) + return; + if (lexer_current(lexer) == '\n') { + lexer->line += 1; + lexer->column = 1; + } else { + lexer->column += 1; + } + lexer->index += 1; +} diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..ac5288e --- /dev/null +++ b/Makefile @@ -0,0 +1,19 @@ + +CFLAGS = -std=c17 -Wall -Wextra -Wpedantic -Wconversion + +HEADERS = $(wildcard *.h) + +all: compile_flags.txt wacc + +wacc: main.o lexer.o + gcc $^ -o $@ + +%.o: %.c $(HEADERS) + gcc $< -c -o $@ $(CFLAGS) + +clean: + rm -rf *.o wacc + +compile_flags.txt: + echo -xc $(CFLAGS) | sed 's/\s\+/\n/g' > compile_flags.txt + diff --git a/compile_flags.txt b/compile_flags.txt new file mode 100644 index 0000000..083ed44 --- /dev/null +++ b/compile_flags.txt @@ -0,0 +1,6 @@ +-xc +-std=c17 +-Wall +-Wextra +-Wpedantic +-Wconversion diff --git a/lexer.c b/lexer.c new file mode 100644 index 0000000..297c410 --- /dev/null +++ b/lexer.c @@ -0,0 +1,353 @@ +#include "lexer.h" +#include +#include +#include +#include + +struct Lexer { + const char* text; + size_t index, length; + int line, column; +}; + +Token lexer_skip_whitespace(Lexer* lexer); +Token lexer_make_int_or_float(Lexer* lexer); +Token lexer_make_id(Lexer* lexer); +bool lexer_span_matches(const Lexer* lexer, Position begin, const char* value); +Token lexer_make_static_token(Lexer* lexer); +Token lexer_make_int_hex_or_binary(Lexer* lexer); +Token lexer_make_char(Lexer* lexer); +Token lexer_make_string(Lexer* lexer); +void lexer_skip_literal_char(Lexer* lexer); +Token lexer_make_single_char_token(Lexer* lexer, TokenType type); +Token lexer_make_slash_token(Lexer* lexer); +Token lexer_skip_singleline_comment(Lexer* lexer); +Token lexer_make_single_or_double_char_token( + Lexer* lexer, TokenType single_type, char second_char, TokenType double_type); +Token lexer_skip_multiline_comment(Lexer* lexer); +Token lexer_make_invalid_char(Lexer* lexer); +Position lexer_position(const Lexer* lexer); +Token lexer_token(const Lexer* lexer, TokenType type, Position begin); +bool lexer_done(const Lexer* lexer); +char lexer_current(const Lexer* lexer); +void lexer_step(Lexer* lexer); + +void lexer_create(Lexer* lexer, const char* text, size_t text_length) +{ + *lexer = (Lexer) { + .text = text, + .length = text_length, + .line = 1, + .column = 1, + }; +} + +Token lexer_next(Lexer* lexer) +{ + char c = lexer_current(lexer); + if (lexer_done(lexer)) + return lexer_token(lexer, TokenTypeEof, lexer_position(lexer)); + else if (isspace(c)) + return lexer_skip_whitespace(lexer); + else if (c >= '1' && c <= '9') + return lexer_make_int_or_float(lexer); + else if (isalpha(c) || c == '_') + return lexer_make_id(lexer); + else + return lexer_make_static_token(lexer); +} + +Token lexer_skip_whitespace(Lexer* lexer) +{ + lexer_step(lexer); + while (!lexer_done(lexer) && isspace(lexer_current(lexer))) + lexer_step(lexer); + return lexer_next(lexer); +} + +Token lexer_make_int_or_float(Lexer* lexer) +{ + Position begin = lexer_position(lexer); + lexer_step(lexer); + while (!lexer_done(lexer) && isdigit(lexer_current(lexer))) + lexer_step(lexer); + if (!lexer_done(lexer) && lexer_current(lexer) == '.') { + while (!lexer_done(lexer) && isdigit(lexer_current(lexer))) + lexer_step(lexer); + return lexer_token(lexer, TokenTypeFloat, begin); + } else { + return lexer_token(lexer, TokenTypeInt, begin); + } +} + +Token lexer_make_id(Lexer* lexer) +{ + Position begin = lexer_position(lexer); + lexer_step(lexer); + while (!lexer_done(lexer) + && (isalpha(lexer_current(lexer)) || isdigit(lexer_current(lexer)) + || lexer_current(lexer) == '_')) + lexer_step(lexer); + if (lexer_span_matches(lexer, begin, "if")) + return lexer_token(lexer, TokenTypeIf, begin); + else if (lexer_span_matches(lexer, begin, "else")) + return lexer_token(lexer, TokenTypeElse, begin); + else if (lexer_span_matches(lexer, begin, "while")) + return lexer_token(lexer, TokenTypeWhile, begin); + else if (lexer_span_matches(lexer, begin, "break")) + return lexer_token(lexer, TokenTypeBreak, begin); + else + return lexer_token(lexer, TokenTypeId, begin); +} + +bool lexer_span_matches(const Lexer* lexer, Position begin, const char* value) +{ + size_t length = lexer->index - begin.index; + if (length != strlen(value)) + return false; + return strncmp(&lexer->text[begin.index], value, length) == 0; +} + +Token lexer_make_static_token(Lexer* lexer) +{ + switch (lexer_current(lexer)) { + case '0': + return lexer_make_int_hex_or_binary(lexer); + case '\'': + return lexer_make_char(lexer); + case '"': + return lexer_make_string(lexer); + case '(': + return lexer_make_single_char_token(lexer, TokenTypeLParen); + case ')': + return lexer_make_single_char_token(lexer, TokenTypeRParen); + case '{': + return lexer_make_single_char_token(lexer, TokenTypeLBrace); + case '}': + return lexer_make_single_char_token(lexer, TokenTypeRBrace); + case '[': + return lexer_make_single_char_token(lexer, TokenTypeLBracket); + case ']': + return lexer_make_single_char_token(lexer, TokenTypeRBracket); + case '.': + return lexer_make_single_char_token(lexer, TokenTypeDot); + case ',': + return lexer_make_single_char_token(lexer, TokenTypeComma); + case ':': + return lexer_make_single_char_token(lexer, TokenTypeColon); + case ';': + return lexer_make_single_char_token(lexer, TokenTypeSemicolon); + case '+': + return lexer_make_single_or_double_char_token( + lexer, TokenTypePlus, '=', TokenTypePlusEqual); + case '-': + return lexer_make_single_or_double_char_token( + lexer, TokenTypeMinus, '=', TokenTypeMinusEqual); + case '*': + return lexer_make_single_or_double_char_token( + lexer, TokenTypeAsterisk, '=', TokenTypeAsteriskEqual); + case '/': + return lexer_make_slash_token(lexer); + case '%': + return lexer_make_single_or_double_char_token( + lexer, TokenTypePercent, '=', TokenTypePercentEqual); + case '=': + return lexer_make_single_or_double_char_token( + lexer, TokenTypeEqual, '=', TokenTypeDoubleEqual); + case '!': + return lexer_make_single_or_double_char_token( + lexer, TokenTypeExclamation, '=', TokenTypeExclamationEqual); + case '<': + return lexer_make_single_or_double_char_token( + lexer, TokenTypeLt, '=', TokenTypeLtEqual); + case '>': + return lexer_make_single_or_double_char_token( + lexer, TokenTypeGt, '=', TokenTypeGtEqual); + default: + return lexer_make_invalid_char(lexer); + } +} + +Token lexer_make_int_hex_or_binary(Lexer* lexer) +{ + Position begin = lexer_position(lexer); + lexer_step(lexer); + if (!lexer_done(lexer) && (lexer_current(lexer) == 'x' || lexer_current(lexer) == 'X')) { + while (!lexer_done(lexer) + && (isdigit(lexer_current(lexer)) + || (lexer_current(lexer) >= 'a' || lexer_current(lexer) <= 'f') + || (lexer_current(lexer) >= 'A' || lexer_current(lexer) <= 'F'))) + lexer_step(lexer); + return lexer_token(lexer, TokenTypeHex, begin); + } else if (!lexer_done(lexer) && (lexer_current(lexer) == 'b' || lexer_current(lexer) == 'B')) { + while (!lexer_done(lexer) && (lexer_current(lexer) == '0' || lexer_current(lexer) == '1')) + lexer_step(lexer); + return lexer_token(lexer, TokenTypeBinary, begin); + } else { + return lexer_token(lexer, TokenTypeInt, begin); + } +} + +Token lexer_make_char(Lexer* lexer) +{ + Position begin = lexer_position(lexer); + lexer_step(lexer); + if (lexer_done(lexer)) + return lexer_token(lexer, TokenTypeMalformedChar, begin); + lexer_skip_literal_char(lexer); + if (lexer_done(lexer) && lexer_current(lexer) != '\'') + return lexer_token(lexer, TokenTypeMalformedChar, begin); + lexer_step(lexer); + return lexer_token(lexer, TokenTypeChar, begin); +} + +Token lexer_make_string(Lexer* lexer) +{ + Position begin = lexer_position(lexer); + lexer_step(lexer); + if (lexer_done(lexer)) + return lexer_token(lexer, TokenTypeMalformedString, begin); + while (!lexer_done(lexer) && lexer_current(lexer) != '\"') + lexer_skip_literal_char(lexer); + if (lexer_done(lexer) && lexer_current(lexer) != '\"') + return lexer_token(lexer, TokenTypeMalformedString, begin); + lexer_step(lexer); + return lexer_token(lexer, TokenTypeChar, begin); +} + +void lexer_skip_literal_char(Lexer* lexer) +{ + if (lexer_current(lexer) == '\\') { + lexer_step(lexer); + if (!lexer_done(lexer) && lexer_current(lexer) == '0') { + lexer_step(lexer); + } else if (!lexer_done(lexer) && lexer_current(lexer) >= '1' + && lexer_current(lexer) <= '9') { + lexer_step(lexer); + while (!lexer_done(lexer) && isdigit(lexer_current(lexer))) + lexer_step(lexer); + } else if (!lexer_done(lexer) + && (lexer_current(lexer) == 'x' || lexer_current(lexer) == 'X')) { + lexer_step(lexer); + while (!lexer_done(lexer) + && (isdigit(lexer_current(lexer)) + || (lexer_current(lexer) >= 'a' && lexer_current(lexer) <= 'f') + || (lexer_current(lexer) >= 'A' && lexer_current(lexer) <= 'F'))) + lexer_step(lexer); + } else if (!lexer_done(lexer)) { + lexer_step(lexer); + } + } else { + lexer_step(lexer); + } +} + +Token lexer_make_single_char_token(Lexer* lexer, TokenType type) +{ + Position begin = lexer_position(lexer); + lexer_step(lexer); + return lexer_token(lexer, type, begin); +} + +Token lexer_make_single_or_double_char_token( + Lexer* lexer, TokenType single_type, char second_char, TokenType double_type) +{ + Position begin = lexer_position(lexer); + lexer_step(lexer); + if (!lexer_done(lexer) && lexer_current(lexer) == second_char) { + lexer_step(lexer); + return lexer_token(lexer, single_type, begin); + } else { + return lexer_token(lexer, double_type, begin); + } +} + +Token lexer_make_slash_token(Lexer* lexer) +{ + Position begin = lexer_position(lexer); + lexer_step(lexer); + switch (lexer_current(lexer)) { + case '/': + return lexer_skip_singleline_comment(lexer); + case '*': + return lexer_skip_multiline_comment(lexer); + case '=': + lexer_step(lexer); + return lexer_token(lexer, TokenTypeSlashEqual, begin); + default: + return lexer_token(lexer, TokenTypeSlash, begin); + } +} + +Token lexer_skip_singleline_comment(Lexer* lexer) +{ + lexer_step(lexer); + while (!lexer_done(lexer) && lexer_current(lexer) != '\n') + lexer_step(lexer); + if (!lexer_done(lexer) && lexer_current(lexer) == '\n') + lexer_step(lexer); + return lexer_next(lexer); +} + +Token lexer_skip_multiline_comment(Lexer* lexer) +{ + lexer_step(lexer); + int depth = 1; + while (!lexer_done(lexer)) { + if (lexer_current(lexer) == '/') { + lexer_step(lexer); + if (!lexer_done(lexer) && lexer_current(lexer) == '*') + depth += 1; + } else if (lexer_current(lexer) == '*') { + lexer_step(lexer); + if (lexer_done(lexer) && lexer_current(lexer) == '/') + depth -= 1; + } + lexer_step(lexer); + } + return depth != 0 + ? lexer_token(lexer, TokenTypeMalformedMultilineComment, lexer_position(lexer)) + : lexer_next(lexer); +} + +Token lexer_make_invalid_char(Lexer* lexer) +{ + Position begin = lexer_position(lexer); + lexer_step(lexer); + return lexer_token(lexer, TokenTypeInvalidChar, begin); +} + +Position lexer_position(const Lexer* lexer) +{ + return (Position) { + .index = lexer->index, + .line = lexer->line, + .column = lexer->column, + }; +} + +Token lexer_token(const Lexer* lexer, TokenType type, Position begin) +{ + return (Token) { + .type = type, + .position = begin, + .length = lexer->index - begin.index, + }; +} + +bool lexer_done(const Lexer* lexer) { return lexer->index >= lexer->length; } + +char lexer_current(const Lexer* lexer) { return lexer->text[lexer->index]; } + +void lexer_step(Lexer* lexer) +{ + if (lexer_done(lexer)) + return; + if (lexer_current(lexer) == '\n') { + lexer->line += 1; + lexer->column = 1; + } else { + lexer->column += 1; + } + lexer->index += 1; +} diff --git a/lexer.h b/lexer.h new file mode 100644 index 0000000..1efce31 --- /dev/null +++ b/lexer.h @@ -0,0 +1,76 @@ +#ifndef LEXER_H +#define LEXER_H + +#include + +typedef enum { + TokenTypeEof, + + TokenTypeInvalidChar, + TokenTypeMalformedMultilineComment, + TokenTypeMalformedChar, + TokenTypeMalformedString, + + TokenTypeId, + TokenTypeInt, + TokenTypeHex, + TokenTypeBinary, + TokenTypeFloat, + TokenTypeChar, + TokenTypeString, + + TokenTypeIf, + TokenTypeElse, + TokenTypeWhile, + TokenTypeBreak, + + TokenTypeLParen, + TokenTypeRParen, + TokenTypeLBrace, + TokenTypeRBrace, + TokenTypeLBracket, + TokenTypeRBracket, + TokenTypeDot, + TokenTypeComma, + TokenTypeColon, + TokenTypeSemicolon, + + TokenTypePlusEqual, + TokenTypeMinusEqual, + TokenTypeAsteriskEqual, + TokenTypeSlashEqual, + TokenTypePercentEqual, + TokenTypeDoubleEqual, + TokenTypeExclamationEqual, + TokenTypeLtEqual, + TokenTypeGtEqual, + + TokenTypePlus, + TokenTypeMinus, + TokenTypeAsterisk, + TokenTypeSlash, + TokenTypePercent, + TokenTypeEqual, + TokenTypeExclamation, + TokenTypeLt, + TokenTypeGt, + +} TokenType; + +typedef struct { + size_t index; + int line, column; +} Position; + +typedef struct { + TokenType type; + Position position; + size_t length; +} Token; + +typedef struct Lexer Lexer; + +void lexer_create(Lexer* lexer, const char* text, size_t text_length); +Token lexer_next(Lexer* lexer); + +#endif diff --git a/lexer.o b/lexer.o new file mode 100644 index 0000000000000000000000000000000000000000..e794c7304e590dd54d4f8a3bcaab12d4d2e651f8 GIT binary patch literal 17072 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 + +int main(void) { printf("hello world\n"); } diff --git a/main.o b/main.o new file mode 100644 index 0000000000000000000000000000000000000000..09c8eea649fb1e473545a06625decf9d9916c024 GIT binary patch literal 1496 zcmbtU&ubG=5S~qHtJu_7Jc#wMCsEKxvR>4KM1wX5@lXheAhJ!jM$Kl!?kl!l6c1t# zLXZ9_9t98jXLu>}sCS{xmz`-}9_vL1-kX_kerD!v-rRd|zZL|f6wqxt))XarR6CYC zQ?Wx!)S!NEcfa@X1d!hDw*&CcxSo6+CZkanzRL2^2GMG_dn>%W`mlc`Y)2+C?J#OZ z*IQAm4QHk~J|Q1uVmGQ$@CBGsAiDN;P7J~8H43(y!OG&o$vrk+WE=-{0oR?S=KET= zG2dqg=zk&PougleRpxr-M2PCsZf7GE!=d$l=(@yqBgUy3SS2 z`Yu#oVF5GhC?NckIJQJT%^Z-vjq`$E5*)L4>9MOgvS0ry+mQ2Lc3ELvcvp TBjhYgRq;Q>(H?o0f*=0}`D|ws literal 0 HcmV?d00001 diff --git a/wacc b/wacc new file mode 100755 index 0000000000000000000000000000000000000000..8ad967f06e9a5dfc69e2b81b0f8a59ac7396d271 GIT binary patch literal 20744 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 X+%C(~cElwjSsM){G0vsnLdAarVN?(d literal 0 HcmV?d00001