defining some structs for the ast
This commit is contained in:
parent
2119791961
commit
035cd53983
12
Makefile
12
Makefile
@ -5,7 +5,7 @@ RM=rm
|
|||||||
CFLAGS=-Wall -Werror -std=gnu99 -O0 -g
|
CFLAGS=-Wall -Werror -std=gnu99 -O0 -g
|
||||||
LIBS=
|
LIBS=
|
||||||
|
|
||||||
FILES=build/main.o build/lexer.o build/token.o build/utils/vector.o build/utils/buffer.o
|
FILES=build/main.o build/lexer.o build/token.o build/parser.o build/model.o build/utils/vector.o build/utils/buffer.o
|
||||||
OUT=bin/pinky.out
|
OUT=bin/pinky.out
|
||||||
|
|
||||||
all: $(FILES)
|
all: $(FILES)
|
||||||
@ -24,6 +24,14 @@ build/token.o: src/token.c
|
|||||||
@$(ECHO) "CC\t\t"$<
|
@$(ECHO) "CC\t\t"$<
|
||||||
@$(CC) $(CFLAGS) $< -c -o $@ $(LIBS)
|
@$(CC) $(CFLAGS) $< -c -o $@ $(LIBS)
|
||||||
|
|
||||||
|
build/parser.o: src/parser.c
|
||||||
|
@$(ECHO) "CC\t\t"$<
|
||||||
|
@$(CC) $(CFLAGS) $< -c -o $@ $(LIBS)
|
||||||
|
|
||||||
|
build/model.o: src/model.c
|
||||||
|
@$(ECHO) "CC\t\t"$<
|
||||||
|
@$(CC) $(CFLAGS) $< -c -o $@ $(LIBS)
|
||||||
|
|
||||||
build/utils/vector.o: src/utils/vector.c
|
build/utils/vector.o: src/utils/vector.c
|
||||||
@$(ECHO) "CC\t\t"$<
|
@$(ECHO) "CC\t\t"$<
|
||||||
@$(CC) $(CFLAGS) $< -c -o $@ $(LIBS)
|
@$(CC) $(CFLAGS) $< -c -o $@ $(LIBS)
|
||||||
@ -33,7 +41,7 @@ build/utils/buffer.o: src/utils/buffer.c
|
|||||||
@$(CC) $(CFLAGS) $< -c -o $@ $(LIBS)
|
@$(CC) $(CFLAGS) $< -c -o $@ $(LIBS)
|
||||||
|
|
||||||
run: all
|
run: all
|
||||||
@$(OUT) tests/program.pinky
|
@$(OUT) tests/expr.pinky
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
@$(ECHO) "Cleaning..."
|
@$(ECHO) "Cleaning..."
|
||||||
|
20
src/lexer.c
20
src/lexer.c
@ -275,8 +275,16 @@ lexer_lex (struct lexer *l)
|
|||||||
else if (c == '%')
|
else if (c == '%')
|
||||||
add_token (TOK_MOD, l);
|
add_token (TOK_MOD, l);
|
||||||
/* multi-character tokens */
|
/* multi-character tokens */
|
||||||
else if (c == '=' && match ('=', l))
|
else if (c == '=')
|
||||||
add_token (TOK_EQ, l);
|
{
|
||||||
|
if (match ('=', l))
|
||||||
|
{
|
||||||
|
add_token (TOK_EQEQ, l);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
add_token (TOK_EQ, l);
|
||||||
|
}
|
||||||
else if (c == '~')
|
else if (c == '~')
|
||||||
add_token (match ('=', l) ? TOK_EQ : TOK_NOT, l);
|
add_token (match ('=', l) ? TOK_EQ : TOK_NOT, l);
|
||||||
else if (c == '<')
|
else if (c == '<')
|
||||||
@ -297,6 +305,14 @@ lexer_lex (struct lexer *l)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct vector *
|
||||||
|
lexer_get_tokens (struct lexer *l)
|
||||||
|
{
|
||||||
|
if (!l)
|
||||||
|
return NULL;
|
||||||
|
return &l->tokens;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
lexer_print (struct lexer *l)
|
lexer_print (struct lexer *l)
|
||||||
{
|
{
|
||||||
|
@ -15,6 +15,7 @@ struct lexer
|
|||||||
struct lexer lexer_create ();
|
struct lexer lexer_create ();
|
||||||
void lexer_set_source (struct buffer *b, struct lexer *l);
|
void lexer_set_source (struct buffer *b, struct lexer *l);
|
||||||
void lexer_lex (struct lexer *l);
|
void lexer_lex (struct lexer *l);
|
||||||
|
struct vector *lexer_get_tokens (struct lexer *l);
|
||||||
void lexer_print (struct lexer *l);
|
void lexer_print (struct lexer *l);
|
||||||
void lexer_free (struct lexer *lexer);
|
void lexer_free (struct lexer *lexer);
|
||||||
|
|
||||||
|
17
src/main.c
17
src/main.c
@ -1,11 +1,10 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
#include <time.h>
|
|
||||||
|
|
||||||
#include "utils/buffer.h"
|
#include "utils/buffer.h"
|
||||||
|
|
||||||
#include "lexer.h"
|
#include "lexer.h"
|
||||||
|
#include "parser.h"
|
||||||
|
|
||||||
int
|
int
|
||||||
main (int argc, char **argv)
|
main (int argc, char **argv)
|
||||||
@ -16,9 +15,6 @@ main (int argc, char **argv)
|
|||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct timespec ts1, ts2;
|
|
||||||
clock_gettime (CLOCK_REALTIME, &ts1);
|
|
||||||
|
|
||||||
struct buffer code = buffer_create ();
|
struct buffer code = buffer_create ();
|
||||||
if (!buffer_read (argv[1], &code))
|
if (!buffer_read (argv[1], &code))
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
@ -28,15 +24,12 @@ main (int argc, char **argv)
|
|||||||
lexer_lex (&lexer);
|
lexer_lex (&lexer);
|
||||||
lexer_print (&lexer);
|
lexer_print (&lexer);
|
||||||
|
|
||||||
|
struct parser parser = parser_create (lexer_get_tokens (&lexer));
|
||||||
|
parser_parse (&parser);
|
||||||
|
parser_print (&parser);
|
||||||
|
|
||||||
lexer_free (&lexer);
|
lexer_free (&lexer);
|
||||||
buffer_free (&code);
|
buffer_free (&code);
|
||||||
|
|
||||||
clock_gettime (CLOCK_REALTIME, &ts2);
|
|
||||||
unsigned long long ndiff = ts2.tv_nsec - ts1.tv_nsec;
|
|
||||||
unsigned long long sdiff = ts2.tv_sec - ts1.tv_sec;
|
|
||||||
|
|
||||||
printf ("it took %llu nanoseconds and %llu seconds to complete.\n", ndiff,
|
|
||||||
sdiff);
|
|
||||||
|
|
||||||
return EXIT_SUCCESS;
|
return EXIT_SUCCESS;
|
||||||
}
|
}
|
||||||
|
36
src/model.c
Normal file
36
src/model.c
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
#include "model.h"
|
||||||
|
|
||||||
|
struct expression
|
||||||
|
expression_create_integer (int value)
|
||||||
|
{
|
||||||
|
return (struct expression){ .type = EXPR_INT, .integer = value };
|
||||||
|
}
|
||||||
|
|
||||||
|
struct expression
|
||||||
|
expression_create_floating (int value)
|
||||||
|
{
|
||||||
|
return (struct expression){ .type = EXPR_FLOAT, .floating = value };
|
||||||
|
}
|
||||||
|
|
||||||
|
struct expression
|
||||||
|
expression_create_binop (struct token *op, struct expression *left,
|
||||||
|
struct expression *right)
|
||||||
|
{
|
||||||
|
return (struct expression){ .type = EXPR_BINOP,
|
||||||
|
.binop
|
||||||
|
= { .op = op, .left = left, .right = right } };
|
||||||
|
}
|
||||||
|
|
||||||
|
struct expression
|
||||||
|
expression_create_unop (struct token *op, struct expression *operand)
|
||||||
|
{
|
||||||
|
return (struct expression){ .type = EXPR_UNOP,
|
||||||
|
.unop = { .op = op, .operand = operand } };
|
||||||
|
}
|
||||||
|
|
||||||
|
struct expression
|
||||||
|
expression_create_grouping (struct expression *value)
|
||||||
|
{
|
||||||
|
return (struct expression){ .type = EXPR_GROUP,
|
||||||
|
.grouping = { .value = value } };
|
||||||
|
}
|
78
src/model.h
Normal file
78
src/model.h
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
#ifndef __MODEL_H
|
||||||
|
#define __MODEL_H
|
||||||
|
|
||||||
|
#include "token.h"
|
||||||
|
|
||||||
|
/********************************
|
||||||
|
* Expression
|
||||||
|
********************************/
|
||||||
|
enum expression_type
|
||||||
|
{
|
||||||
|
EXPR_INT,
|
||||||
|
EXPR_FLOAT,
|
||||||
|
EXPR_BINOP,
|
||||||
|
EXPR_UNOP,
|
||||||
|
EXPR_GROUP
|
||||||
|
};
|
||||||
|
|
||||||
|
struct expression
|
||||||
|
{
|
||||||
|
enum expression_type type;
|
||||||
|
|
||||||
|
union
|
||||||
|
{
|
||||||
|
/* integer (i.e. 2) */
|
||||||
|
int integer;
|
||||||
|
|
||||||
|
/* floating (i.e. 3.141592) */
|
||||||
|
float floating;
|
||||||
|
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
/* binary operations (i.e. x + y) */
|
||||||
|
struct token *op;
|
||||||
|
struct expression *left;
|
||||||
|
struct expression *right;
|
||||||
|
} binop;
|
||||||
|
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
/* unary operations (i.e. -x) */
|
||||||
|
struct token *op;
|
||||||
|
struct expression *operand;
|
||||||
|
} unop;
|
||||||
|
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
/* grouping: ( <expr> ) */
|
||||||
|
struct expression *value;
|
||||||
|
} grouping;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
struct expression expression_create_integer (int value);
|
||||||
|
struct expression expression_create_floating (int value);
|
||||||
|
struct expression expression_create_binop (struct token *op,
|
||||||
|
struct expression *left,
|
||||||
|
struct expression *right);
|
||||||
|
struct expression expression_create_unop (struct token *op,
|
||||||
|
struct expression *operand);
|
||||||
|
struct expression expression_create_grouping (struct expression *value);
|
||||||
|
|
||||||
|
/********************************
|
||||||
|
* Statements
|
||||||
|
********************************/
|
||||||
|
struct stmt
|
||||||
|
{
|
||||||
|
union
|
||||||
|
{
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
} while_stmt;
|
||||||
|
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
} assignment;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
22
src/parser.c
Normal file
22
src/parser.c
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
#include "parser.h"
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
struct parser
|
||||||
|
parser_create (struct vector *tokens)
|
||||||
|
{
|
||||||
|
return (struct parser){ .tokens = tokens, .curr = 0 };
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
parser_parse (struct parser *p)
|
||||||
|
{
|
||||||
|
if (!p)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
parser_print (struct parser *p)
|
||||||
|
{
|
||||||
|
puts ("Parser:");
|
||||||
|
}
|
16
src/parser.h
Normal file
16
src/parser.h
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
#ifndef __PARSER_H
|
||||||
|
#define __PARSER_H
|
||||||
|
|
||||||
|
#include "utils/vector.h"
|
||||||
|
|
||||||
|
struct parser
|
||||||
|
{
|
||||||
|
struct vector *tokens;
|
||||||
|
unsigned int curr;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct parser parser_create (struct vector *tokens);
|
||||||
|
void parser_parse (struct parser *p);
|
||||||
|
void parser_print (struct parser *p);
|
||||||
|
|
||||||
|
#endif
|
@ -26,12 +26,13 @@ enum token_type
|
|||||||
TOK_NOT,
|
TOK_NOT,
|
||||||
TOK_GT,
|
TOK_GT,
|
||||||
TOK_LT,
|
TOK_LT,
|
||||||
|
TOK_EQ,
|
||||||
|
|
||||||
/* multiple character tokens */
|
/* multiple character tokens */
|
||||||
TOK_GE,
|
TOK_GE,
|
||||||
TOK_LE,
|
TOK_LE,
|
||||||
TOK_NE,
|
TOK_NE,
|
||||||
TOK_EQ,
|
TOK_EQEQ,
|
||||||
TOK_ASSIGN,
|
TOK_ASSIGN,
|
||||||
TOK_GTGT,
|
TOK_GTGT,
|
||||||
TOK_LTLT,
|
TOK_LTLT,
|
||||||
|
@ -1,2 +1,4 @@
|
|||||||
|
--------------------------------
|
||||||
-- Evaluate a simple expression
|
-- Evaluate a simple expression
|
||||||
2 + 3
|
--------------------------------
|
||||||
|
2 + 42 * 2 + (47 * -21)
|
Loading…
x
Reference in New Issue
Block a user