This commit is contained in:
SimonFJ20 2023-02-20 01:22:17 +01:00
parent 96c7fc0f7d
commit 167ac3d09d
2 changed files with 100 additions and 44 deletions

View File

@ -1,5 +1,14 @@
#include "parser.h" #include "parser.h"
#include "lexer.h" #include "lexer.h"
#include <stdlib.h>
#include <string.h>
inline char* allocate_string(const char* source)
{
char* destination = malloc(strlen(source) + 1);
strcpy(destination, source);
return destination;
}
void parser_create(Parser* parser, Lexer* lexer) void parser_create(Parser* parser, Lexer* lexer)
{ {
@ -9,4 +18,40 @@ void parser_create(Parser* parser, Lexer* lexer)
}; };
} }
void parser_parse_expression(Parser* parser) { } ParsedExpr* parser_parse_expression(Parser* parser) { return NULL; }
ParsedExpr* parser_parse_operand(Parser* parser)
{
Token current_token = parser_current(parser);
if (!parser_done(parser) && parser_current(parser).type == TokenTypeId) {
} else {
parser_step(parser);
return parsed_expr_allocate(&(ParsedExpr) {
.type = ParsedExprTypeError,
.error = {
.position = current_token.position,
.message = allocate_string("expected value"),
},
});
}
}
bool parser_done(const Parser* parser)
{
return parser->current.type == TokenTypeEof;
}
Token parser_current(const Parser* parser) { return parser->current; }
void parser_step(Parser* parser)
{
parser->current = lexer_next(parser->lexer);
}
ParsedExpr* parsed_expr_allocate(const ParsedExpr* source)
{
ParsedExpr* destination = malloc(sizeof(ParsedExpr));
*destination = *source;
return destination;
}

View File

@ -7,28 +7,28 @@
#include <stdint.h> #include <stdint.h>
typedef enum { typedef enum {
ParsedNodeTypeError, ParsedExprTypeError,
ParsedNodeTypeInt, ParsedExprTypeInt,
ParsedNodeTypeFloat, ParsedExprTypeFloat,
ParsedNodeTypeChar, ParsedExprTypeChar,
ParsedNodeTypeString, ParsedExprTypeString,
ParsedNodeTypeBool, ParsedExprTypeBool,
ParsedNodeTypeArray, ParsedExprTypeArray,
ParsedNodeTypeDict, ParsedExprTypeDict,
ParsedNodeTypeIf, ParsedExprTypeIf,
ParsedNodeTypeWhile, ParsedExprTypeWhile,
ParsedNodeTypeLoop, ParsedExprTypeLoop,
ParsedNodeTypeFor, ParsedExprTypeFor,
ParsedNodeTypeCall, ParsedExprTypeCall,
ParsedNodeTypeAccess, ParsedExprTypeAccess,
ParsedNodeTypeIndex, ParsedExprTypeIndex,
ParsedNodeTypeUnary, ParsedExprTypeUnary,
ParsedNodeTypeBinary, ParsedExprTypeBinary,
ParsedNodeTypeAssign, ParsedExprTypeAssign,
ParsedNodeTypeRangeFrom, ParsedExprTypeRangeFrom,
ParsedNodeTypeRangeTo, ParsedExprTypeRangeTo,
ParsedNodeTypeRangeFromTo, ParsedExprTypeRangeFromTo,
} ParsedNodeType; } ParsedExprType;
typedef enum { typedef enum {
ParsedBinaryTypeAdd, ParsedBinaryTypeAdd,
@ -59,11 +59,15 @@ typedef enum {
} ParsedAssignType; } ParsedAssignType;
typedef struct KeyValuePair KeyValuePair; typedef struct KeyValuePair KeyValuePair;
typedef struct ParsedNode ParsedNode; typedef struct ParsedExpr ParsedExpr;
struct ParsedNode { struct ParsedExpr {
ParsedNodeType type; ParsedExprType type;
union { union {
struct {
Position position;
char* message;
} error;
int64_t int_value; int64_t int_value;
double float_value; double float_value;
char char_value; char char_value;
@ -73,7 +77,7 @@ struct ParsedNode {
} string; } string;
bool bool_value; bool bool_value;
struct { struct {
ParsedNode* values; ParsedExpr* values;
size_t length; size_t length;
} array; } array;
struct { struct {
@ -81,42 +85,44 @@ struct ParsedNode {
size_t length; size_t length;
} dict; } dict;
struct { struct {
ParsedNode* condition; ParsedExpr* condition;
ParsedNode* truthy; ParsedExpr* truthy;
ParsedNode* falsy; ParsedExpr* falsy;
} if_node; } if_node;
struct { struct {
ParsedNode* condition; ParsedExpr* condition;
ParsedNode* body; ParsedExpr* body;
} while_node; } while_node;
struct { struct {
ParsedNode* body; ParsedExpr* body;
} loop; } loop;
struct { struct {
ParsedNode* subject; ParsedExpr* subject;
ParsedNode* value; ParsedExpr* value;
ParsedNode* body; ParsedExpr* body;
} for_node; } for_node;
struct { struct {
ParsedNode* subject; ParsedExpr* subject;
ParsedNode* arguments; ParsedExpr* arguments;
size_t arguments_length; size_t arguments_length;
} call; } call;
struct { struct {
ParsedNode* subject; ParsedExpr* subject;
ParsedNode* value; ParsedExpr* value;
} access; } access;
struct { struct {
ParsedNode* subject; ParsedExpr* subject;
ParsedNode* value; ParsedExpr* value;
} index; } index;
}; };
}; };
ParsedExpr* parsed_expr_allocate(const ParsedExpr* source);
struct KeyValuePair { struct KeyValuePair {
char* key; char* key;
size_t key_length; size_t key_length;
ParsedNode* value; ParsedExpr* value;
}; };
typedef struct { typedef struct {
@ -125,6 +131,11 @@ typedef struct {
} Parser; } Parser;
void parser_create(Parser* parser, Lexer* lexer); void parser_create(Parser* parser, Lexer* lexer);
void parser_parse_expression(Parser* parser); ParsedExpr* parser_parse_expression(Parser* parser);
ParsedExpr* parser_parse_operand(Parser* parser);
bool parser_done(const Parser* parser);
Token parser_current(const Parser* parser);
void parser_step(Parser* parser);
#endif #endif