Begin semantics
This commit is contained in:
parent
acf66e1816
commit
4aff13c332
@ -1,3 +1,4 @@
|
|||||||
|
#include "syntax.h"
|
||||||
#include "lexer.h"
|
#include "lexer.h"
|
||||||
#include "parser.h"
|
#include "parser.h"
|
||||||
|
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
%{
|
%{
|
||||||
|
#include "syntax.h"
|
||||||
#include "parser.h"
|
#include "parser.h"
|
||||||
int stack[100]; // Max indentation depth
|
int stack[100]; // Max indentation depth
|
||||||
int sp = -1;
|
int sp = -1;
|
||||||
|
21
src/parser.y
21
src/parser.y
@ -8,14 +8,19 @@ int yyerror(const char* p) { fprintf(stderr, p); }
|
|||||||
%define parse.trace
|
%define parse.trace
|
||||||
|
|
||||||
%union {
|
%union {
|
||||||
|
expr_t expr;
|
||||||
|
binop_t binop;
|
||||||
|
atom_t id;
|
||||||
|
num_t num;
|
||||||
char *sym;
|
char *sym;
|
||||||
float num;
|
string_t string;
|
||||||
}
|
}
|
||||||
|
|
||||||
%token <sym> ID
|
%token <id> ID
|
||||||
%token STOP
|
|
||||||
%token <num> NUM
|
%token <num> NUM
|
||||||
%token STRING
|
%token <string> STRING
|
||||||
|
|
||||||
|
%token STOP
|
||||||
%token INDENT DEDENT
|
%token INDENT DEDENT
|
||||||
%token IF ELIF ELSE
|
%token IF ELIF ELSE
|
||||||
|
|
||||||
@ -25,6 +30,8 @@ int yyerror(const char* p) { fprintf(stderr, p); }
|
|||||||
%left '/' '*'
|
%left '/' '*'
|
||||||
%left MAPS
|
%left MAPS
|
||||||
|
|
||||||
|
%nterm <expr> expr
|
||||||
|
|
||||||
%%
|
%%
|
||||||
program: statements | statements statement;
|
program: statements | statements statement;
|
||||||
statements: statements statement STOP
|
statements: statements statement STOP
|
||||||
@ -41,8 +48,10 @@ expr: funcdef
|
|||||||
| expr '-' expr
|
| expr '-' expr
|
||||||
| expr '*' expr
|
| expr '*' expr
|
||||||
| expr '/' expr
|
| expr '/' expr
|
||||||
| '(' expr ')'
|
| '(' expr ')' {$$ = $2;}
|
||||||
| ID | NUM | STRING;
|
| ID {$$.id = $1; $$.type = ID;}
|
||||||
|
| NUM {$$.num = $1; $$.type = NUM;}
|
||||||
|
| STRING {$$.string = $1; $$.type = STRING;};
|
||||||
|
|
||||||
funcdef: param MAPS expr | param MAPS block;
|
funcdef: param MAPS expr | param MAPS block;
|
||||||
param: ID | '_' | // null production;
|
param: ID | '_' | // null production;
|
||||||
|
20
src/syntax.h
20
src/syntax.h
@ -1,6 +1,26 @@
|
|||||||
#ifndef SYNTAX_H
|
#ifndef SYNTAX_H
|
||||||
#define SYNTAX_H
|
#define SYNTAX_H
|
||||||
|
|
||||||
|
typedef float num_t;
|
||||||
|
typedef char* atom_t;
|
||||||
|
typedef char* string_t;
|
||||||
|
typedef struct expr_t expr_t;
|
||||||
|
typedef struct binop_t binop_t;
|
||||||
|
|
||||||
|
struct expr_t {
|
||||||
|
int type;
|
||||||
|
union {
|
||||||
|
atom_t id;
|
||||||
|
num_t num;
|
||||||
|
string_t string;
|
||||||
|
binop_t *binop;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
struct binop_t {
|
||||||
|
expr_t *first;
|
||||||
|
expr_t *second;
|
||||||
|
int op;
|
||||||
|
};
|
||||||
|
|
||||||
#endif /* SYNTAX_H */
|
#endif /* SYNTAX_H */
|
||||||
|
Loading…
Reference in New Issue
Block a user