implemented some parts for AST parsing
This commit is contained in:
33
lexer.c
33
lexer.c
@@ -5,6 +5,7 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
typedef struct{
|
typedef struct{
|
||||||
char* mstr;
|
char* mstr;
|
||||||
@@ -71,6 +72,11 @@ typedef struct{
|
|||||||
size_t size;
|
size_t size;
|
||||||
size_t capacity;
|
size_t capacity;
|
||||||
} TokenArr;
|
} TokenArr;
|
||||||
|
// maybe should add cursor even for TokenArr to use C's printf % to add whitespace in order to move something like this
|
||||||
|
// input = 1 + 323 + =-=-
|
||||||
|
// ^
|
||||||
|
// |- Unknown Token
|
||||||
|
|
||||||
|
|
||||||
typedef struct{
|
typedef struct{
|
||||||
char *content;
|
char *content;
|
||||||
@@ -96,15 +102,20 @@ typedef struct{
|
|||||||
char op;
|
char op;
|
||||||
struct ASTNode* left;
|
struct ASTNode* left;
|
||||||
struct ASTNode* right;
|
struct ASTNode* right;
|
||||||
|
// x = 5 + 3 parsed into
|
||||||
|
// =
|
||||||
|
// / \
|
||||||
|
// x / \
|
||||||
|
// 5 3
|
||||||
} binary;
|
} binary;
|
||||||
};
|
};
|
||||||
} ASTNode;
|
} ASTNode;
|
||||||
|
|
||||||
typedef struct{
|
typedef struct{
|
||||||
TokenArr* tokens;
|
Token* tokens;
|
||||||
size_t cursor;
|
size_t cursor;
|
||||||
} parser;
|
} parser;
|
||||||
|
// tokenArr to token*
|
||||||
|
|
||||||
// Lexer
|
// Lexer
|
||||||
void lexer_new(char *content, size_t content_len){
|
void lexer_new(char *content, size_t content_len){
|
||||||
@@ -116,6 +127,24 @@ void lexer_next(Lexer *mylexer){
|
|||||||
(void) mylexer;
|
(void) mylexer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Token parser_peek(parser* p){
|
||||||
|
return p->tokens[p->cursor];
|
||||||
|
}
|
||||||
|
|
||||||
|
Token parser_advance(parser* p){
|
||||||
|
return p->tokens[p->cursor++];
|
||||||
|
}
|
||||||
|
|
||||||
|
bool parser_match(parser* p, symbols tokent){
|
||||||
|
if (parser_peek(p).type == tokent){
|
||||||
|
parser_advance(p);
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// will implement a stack for arithmetic later. do I want a compiler or interpreter? since this is a learning experience im gonna do the easier thing first
|
// will implement a stack for arithmetic later. do I want a compiler or interpreter? since this is a learning experience im gonna do the easier thing first
|
||||||
|
|
||||||
Token read_from_tok(char* text, uint cursor){
|
Token read_from_tok(char* text, uint cursor){
|
||||||
|
|||||||
Reference in New Issue
Block a user