lr/pnode.h
2023-12-20 09:00:01 -06:00

56 lines
1.2 KiB
C

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include"str.h"
#include"vec.h"
#include"tok.h"
#include"mem.h"
//#define vec_pushn(v,n) do{PNode x=n;vec_push(v,&x);}while(0)
typedef enum PARTYPE {PNONE, PEMPTY, PEXPRESSION, PSTATEMENT, PASSIGNMENT, PIF, PCOMMENT, PBLOCK, PWHILE, PVARDECL, PFUNDECL, PRET, PCALL, PASM, PEXTERN, } PARTYPE;
extern const char*partype_names[];
/******
* Grammar:
* STATEMENT: EXPRESSION ';'
* |IDENTIFIER(ARGLIST){STATEMENT}
* |'if'(EXPRESSION){STATEMENT}
* |'while'(EXPRESSION){STATEMENT}
* EXPRESSION: INTEGER
* |IDENTIFIER
* |INTEGER OPERATOR EXPRESSION
* |IDENTIFIER OPERATOR EXPRESSION
* ARGLIST: TYPENAME IDENTIFIER
* |TYPENAME IDENTIFIER ',' ARGLIST
******/
typedef struct PNode
{
struct PNode*parentnode;
Vec tokens;
Vec pnodes;
Vec vars;
Vec funcs;
uint32_t type;
size_t firstline;
size_t stacksize;
} PNode;
typedef struct Parser
{
PNode root;
uint32_t mode;
} Parser;
PNode pnode_new(void);
PNode*pnode_pushnode(PNode*n);
Parser parser_new(void);
void parser_free(Parser*p);
void parser_parse(Parser*p,Vec*t);
void parser_tokens(Parser*p,Vec*t);
void pnode_free(PNode*n);
void pnode_print(PNode*n,size_t lvl);
void pnode_print_brief(PNode*n,size_t lvl);