From 891db19b1099f182439a4550ca9c4d3498b55fe1 Mon Sep 17 00:00:00 2001 From: Simon Date: Sat, 11 Feb 2023 20:06:52 +0100 Subject: [PATCH] add .gitignore --- ' | 36 --------- .gitignore | 5 ++ :w | 187 ---------------------------------------------- compile_flags.txt | 6 ++ lexer.o | Bin 0 -> 16680 bytes main.o | Bin 0 -> 1496 bytes parser.o | Bin 0 -> 936 bytes wacc | Bin 0 -> 20776 bytes 8 files changed, 11 insertions(+), 223 deletions(-) delete mode 100644 ' create mode 100644 .gitignore delete mode 100644 :w create mode 100644 compile_flags.txt create mode 100644 lexer.o create mode 100644 main.o create mode 100644 parser.o create mode 100755 wacc diff --git a/' b/' deleted file mode 100644 index 2ee068e..0000000 --- a/' +++ /dev/null @@ -1,36 +0,0 @@ -#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/.gitignore b/.gitignore new file mode 100644 index 0000000..74e710c --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ + +*.o +wacc +compile_flags.txt + diff --git a/:w b/:w deleted file mode 100644 index eb0d0d5..0000000 --- a/:w +++ /dev/null @@ -1,187 +0,0 @@ -#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/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.o b/lexer.o new file mode 100644 index 0000000000000000000000000000000000000000..6872906b256cf05071e54fd956ab6433000dedab GIT binary patch literal 16680 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 TBjhYgRq;Q>(H?o0f*=0}`D|ws literal 0 HcmV?d00001 diff --git a/parser.o b/parser.o new file mode 100644 index 0000000000000000000000000000000000000000..40d7c0ae8f8804b7d4a31357f9a4ed4b65c8b2aa GIT binary patch literal 936 zcmbVKJx{|h5WR%*)r}1ahA>eiu#zAa24tx!T@V`*0|Rb|KtlPDVmeh-#<$tk=EF*w5kA5-L!IMg6Ql5 zU$}DRy94!PoB=iII#5MZRb`D@-MCWW#m+isidWB{>o?WfrY)_Tt{k|YaDX=YhAm;& zf-{xxafA)hHh93J7M!W{A7f(&b6x)_dTGxTGYsv?VJKqF=QCaeS~&U;lAvZEOCv0{ zF=G}yK6;e*qHhg@_LE-ffBGTzlaJ=uzwi6_r?0#nwPv(n^cV2A%KPtON4`A`e|g8f IM+WKt1&tIlc>n+a literal 0 HcmV?d00001 diff --git a/wacc b/wacc new file mode 100755 index 0000000000000000000000000000000000000000..e198756916c89ec718fbc1f129cdb9dd4fe81cc8 GIT binary patch literal 20776 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