commit ca8634bcf5e28e3656f7f718319042662873b30a
parent 5d85ad48ff9492b53d3550ce3280cbde8449b417
Author: thing1 <l.standen@posteo.com>
Date: Wed, 29 Oct 2025 21:26:11 +0000
improved the type system
Diffstat:
| M | Makefile | | | 8 | +++++--- |
| M | ast.h | | | 21 | ++++++++++++++++++++- |
| M | config.mk | | | 4 | ++-- |
| M | lex.l | | | 14 | ++++++++++++-- |
| A | parse.gv | | | 238 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | parse.h | | | 104 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| M | parse.y | | | 55 | ++++++++++++++++++++++++++++++++++++++++++------------- |
| M | test.fe | | | 6 | ++++-- |
| M | types.c | | | 4 | +--- |
9 files changed, 428 insertions(+), 26 deletions(-)
diff --git a/Makefile b/Makefile
@@ -1,6 +1,6 @@
include config.mk
-SRC = parse.c lex.c types.c
+SRC = parse.c lex.c types.c
OBJ = ${SRC:.c=.o}
all: fela
@@ -12,13 +12,15 @@ fela: ${OBJ}
${CC} ${CFLAGS} -c $<
lex.c: lex.l
+ ${LEX} -o lex.c lex.l
parse.c: parse.y
+ ${YACC} ${YFLAGS} -o parse.c parse.y
graph: fela
- dot y.gv -Tpdf | ${PDFREADER} -
+ dot parse.gv -Tpdf | ${PDFREADER} -
spec: spec.md
smu $< > spec.html
clean:
- rm -rf fela lex.c parse.c y.tab.h *.gv *.pdf *.html *.o
+ rm -rf fela lex.c parse.c parse.h *.gv *.pdf *.html *.o
diff --git a/ast.h b/ast.h
@@ -9,6 +9,12 @@ enum expr_ops {
FUNCTION,
};
+enum type_types {
+ BASIC_T,
+ FUNCTION_T,
+ STRUCT_T,
+};
+
struct ast_expr {
enum expr_ops op;
char *fn;
@@ -31,8 +37,20 @@ struct ast_exprs {
};
+struct ast_type {
+ enum type_types t;
+ union {
+ struct { char *type; }; /* for basic types */
+ struct { /* for functions and structs */
+ int argc;
+ struct ast_type *argv, *ret;
+ };
+ };
+};
+
struct ast_dec {
- char *name, *type;
+ char *name;
+ struct ast_type *type;
struct ast_expr *value;
};
@@ -41,3 +59,4 @@ struct ast_decs {
struct ast_dec *dec;
};
+
diff --git a/config.mk b/config.mk
@@ -1,6 +1,6 @@
CFLAGS = -ggdb -Werror -Wpedantic
-LIBS = -lfl
-YFLAGS = -y -d -g
+LIBS = -lfl -ly
+YFLAGS = -d -g -t -y
CC = cc
YACC = bison
LEX = flex
diff --git a/lex.l b/lex.l
@@ -1,11 +1,21 @@
%{
-#include "y.tab.h"
+#include <stddef.h>
+#include "parse.h"
+
+size_t offset, lineno;
+
+#define YY_USER_ACTION \
+ offset += yyleng;
+
+
%}
%%
"func" { return FUNC; }
+"->" { return RETTYPE; }
[0-9]+ { yylval.l = atol(yytext); return NUMBER; }
[A-z][A-z0-9]* { yylval.s = yytext; return NAME; }
[;=+\-*/\{\}\(\)\[\]] { return yytext[0]; }
-[ \t\n] {;}
+[ \t] {;}
+[\n] { offset = 0; lineno++; }
%%
diff --git a/parse.gv b/parse.gv
@@ -0,0 +1,238 @@
+// Generated by GNU Bison 3.8.2.
+// Report bugs to <bug-bison@gnu.org>.
+// Home page: <https://www.gnu.org/software/bison/>.
+
+digraph "parse.y"
+{
+ node [fontname = courier, shape = box, colorscheme = paired6]
+ edge [fontname = courier]
+
+ 0 [label="State 0\n\l 0 $accept: • body $end\l"]
+ 0 -> 1 [style=solid label="NAME"]
+ 0 -> 2 [style=solid label="FUNC"]
+ 0 -> 3 [style=dashed label="body"]
+ 0 -> 4 [style=dashed label="decs"]
+ 0 -> 5 [style=dashed label="dec"]
+ 0 -> 6 [style=dashed label="type"]
+ 1 [label="State 1\n\l 21 type: NAME •\l"]
+ 1 -> "1R21" [style=solid]
+ "1R21" [label="R21", fillcolor=3, shape=diamond, style=filled]
+ 2 [label="State 2\n\l 22 type: FUNC • '(' ')' RETTYPE type\l"]
+ 2 -> 7 [style=solid label="'('"]
+ 3 [label="State 3\n\l 0 $accept: body • $end\l"]
+ 3 -> 8 [style=solid label="$end"]
+ 4 [label="State 4\n\l 1 body: decs •\l 2 decs: decs • dec ';'\l"]
+ 4 -> 1 [style=solid label="NAME"]
+ 4 -> 2 [style=solid label="FUNC"]
+ 4 -> 9 [style=dashed label="dec"]
+ 4 -> 6 [style=dashed label="type"]
+ 4 -> "4R1" [style=solid]
+ "4R1" [label="R1", fillcolor=3, shape=diamond, style=filled]
+ 5 [label="State 5\n\l 3 decs: dec • ';'\l"]
+ 5 -> 10 [style=solid label="';'"]
+ 6 [label="State 6\n\l 4 dec: type • name\l 5 | type • name '=' expr\l 6 | type • name '=' func\l"]
+ 6 -> 11 [style=solid label="NAME"]
+ 6 -> 12 [style=dashed label="name"]
+ 7 [label="State 7\n\l 22 type: FUNC '(' • ')' RETTYPE type\l"]
+ 7 -> 13 [style=solid label="')'"]
+ 8 [label="State 8\n\l 0 $accept: body $end •\l"]
+ 8 -> "8R0" [style=solid]
+ "8R0" [label="Acc", fillcolor=1, shape=diamond, style=filled]
+ 9 [label="State 9\n\l 2 decs: decs dec • ';'\l"]
+ 9 -> 14 [style=solid label="';'"]
+ 10 [label="State 10\n\l 3 decs: dec ';' •\l"]
+ 10 -> "10R3" [style=solid]
+ "10R3" [label="R3", fillcolor=3, shape=diamond, style=filled]
+ 11 [label="State 11\n\l 20 name: NAME •\l"]
+ 11 -> "11R20" [style=solid]
+ "11R20" [label="R20", fillcolor=3, shape=diamond, style=filled]
+ 12 [label="State 12\n\l 4 dec: type name •\l 5 | type name • '=' expr\l 6 | type name • '=' func\l"]
+ 12 -> 15 [style=solid label="'='"]
+ 12 -> "12R4" [style=solid]
+ "12R4" [label="R4", fillcolor=3, shape=diamond, style=filled]
+ 13 [label="State 13\n\l 22 type: FUNC '(' ')' • RETTYPE type\l"]
+ 13 -> 16 [style=solid label="RETTYPE"]
+ 14 [label="State 14\n\l 2 decs: decs dec ';' •\l"]
+ 14 -> "14R2" [style=solid]
+ "14R2" [label="R2", fillcolor=3, shape=diamond, style=filled]
+ 15 [label="State 15\n\l 5 dec: type name '=' • expr\l 6 | type name '=' • func\l"]
+ 15 -> 11 [style=solid label="NAME"]
+ 15 -> 17 [style=solid label="NUMBER"]
+ 15 -> 18 [style=solid label="'('"]
+ 15 -> 19 [style=dashed label="func"]
+ 15 -> 20 [style=dashed label="expr"]
+ 15 -> 21 [style=dashed label="name"]
+ 16 [label="State 16\n\l 22 type: FUNC '(' ')' RETTYPE • type\l"]
+ 16 -> 1 [style=solid label="NAME"]
+ 16 -> 2 [style=solid label="FUNC"]
+ 16 -> 22 [style=dashed label="type"]
+ 17 [label="State 17\n\l 17 expr: NUMBER •\l"]
+ 17 -> "17R17" [style=solid]
+ "17R17" [label="R17", fillcolor=3, shape=diamond, style=filled]
+ 18 [label="State 18\n\l 9 func: '(' • ')' RETTYPE type '{' decs exprs '}'\l 10 | '(' • ')' RETTYPE type '{' exprs '}'\l 16 expr: '(' • expr ')'\l"]
+ 18 -> 11 [style=solid label="NAME"]
+ 18 -> 17 [style=solid label="NUMBER"]
+ 18 -> 23 [style=solid label="'('"]
+ 18 -> 24 [style=solid label="')'"]
+ 18 -> 25 [style=dashed label="expr"]
+ 18 -> 21 [style=dashed label="name"]
+ 19 [label="State 19\n\l 6 dec: type name '=' func •\l"]
+ 19 -> "19R6" [style=solid]
+ "19R6" [label="R6", fillcolor=3, shape=diamond, style=filled]
+ 20 [label="State 20\n\l 5 dec: type name '=' expr •\l 12 expr: expr • '+' expr\l 13 | expr • '-' expr\l 14 | expr • '/' expr\l 15 | expr • '*' expr\l"]
+ 20 -> 26 [style=solid label="'+'"]
+ 20 -> 27 [style=solid label="'-'"]
+ 20 -> 28 [style=solid label="'*'"]
+ 20 -> 29 [style=solid label="'/'"]
+ 20 -> "20R5" [style=solid]
+ "20R5" [label="R5", fillcolor=3, shape=diamond, style=filled]
+ 21 [label="State 21\n\l 11 expr: name • '=' expr\l 18 | name •\l 19 | name • '(' ')'\l"]
+ 21 -> 30 [style=solid label="'('"]
+ 21 -> 31 [style=solid label="'='"]
+ 21 -> "21R18" [style=solid]
+ "21R18" [label="R18", fillcolor=3, shape=diamond, style=filled]
+ 22 [label="State 22\n\l 22 type: FUNC '(' ')' RETTYPE type •\l"]
+ 22 -> "22R22" [style=solid]
+ "22R22" [label="R22", fillcolor=3, shape=diamond, style=filled]
+ 23 [label="State 23\n\l 16 expr: '(' • expr ')'\l"]
+ 23 -> 11 [style=solid label="NAME"]
+ 23 -> 17 [style=solid label="NUMBER"]
+ 23 -> 23 [style=solid label="'('"]
+ 23 -> 25 [style=dashed label="expr"]
+ 23 -> 21 [style=dashed label="name"]
+ 24 [label="State 24\n\l 9 func: '(' ')' • RETTYPE type '{' decs exprs '}'\l 10 | '(' ')' • RETTYPE type '{' exprs '}'\l"]
+ 24 -> 32 [style=solid label="RETTYPE"]
+ 25 [label="State 25\n\l 12 expr: expr • '+' expr\l 13 | expr • '-' expr\l 14 | expr • '/' expr\l 15 | expr • '*' expr\l 16 | '(' expr • ')'\l"]
+ 25 -> 26 [style=solid label="'+'"]
+ 25 -> 27 [style=solid label="'-'"]
+ 25 -> 28 [style=solid label="'*'"]
+ 25 -> 29 [style=solid label="'/'"]
+ 25 -> 33 [style=solid label="')'"]
+ 26 [label="State 26\n\l 12 expr: expr '+' • expr\l"]
+ 26 -> 11 [style=solid label="NAME"]
+ 26 -> 17 [style=solid label="NUMBER"]
+ 26 -> 23 [style=solid label="'('"]
+ 26 -> 34 [style=dashed label="expr"]
+ 26 -> 21 [style=dashed label="name"]
+ 27 [label="State 27\n\l 13 expr: expr '-' • expr\l"]
+ 27 -> 11 [style=solid label="NAME"]
+ 27 -> 17 [style=solid label="NUMBER"]
+ 27 -> 23 [style=solid label="'('"]
+ 27 -> 35 [style=dashed label="expr"]
+ 27 -> 21 [style=dashed label="name"]
+ 28 [label="State 28\n\l 15 expr: expr '*' • expr\l"]
+ 28 -> 11 [style=solid label="NAME"]
+ 28 -> 17 [style=solid label="NUMBER"]
+ 28 -> 23 [style=solid label="'('"]
+ 28 -> 36 [style=dashed label="expr"]
+ 28 -> 21 [style=dashed label="name"]
+ 29 [label="State 29\n\l 14 expr: expr '/' • expr\l"]
+ 29 -> 11 [style=solid label="NAME"]
+ 29 -> 17 [style=solid label="NUMBER"]
+ 29 -> 23 [style=solid label="'('"]
+ 29 -> 37 [style=dashed label="expr"]
+ 29 -> 21 [style=dashed label="name"]
+ 30 [label="State 30\n\l 19 expr: name '(' • ')'\l"]
+ 30 -> 38 [style=solid label="')'"]
+ 31 [label="State 31\n\l 11 expr: name '=' • expr\l"]
+ 31 -> 11 [style=solid label="NAME"]
+ 31 -> 17 [style=solid label="NUMBER"]
+ 31 -> 23 [style=solid label="'('"]
+ 31 -> 39 [style=dashed label="expr"]
+ 31 -> 21 [style=dashed label="name"]
+ 32 [label="State 32\n\l 9 func: '(' ')' RETTYPE • type '{' decs exprs '}'\l 10 | '(' ')' RETTYPE • type '{' exprs '}'\l"]
+ 32 -> 1 [style=solid label="NAME"]
+ 32 -> 2 [style=solid label="FUNC"]
+ 32 -> 40 [style=dashed label="type"]
+ 33 [label="State 33\n\l 16 expr: '(' expr ')' •\l"]
+ 33 -> "33R16" [style=solid]
+ "33R16" [label="R16", fillcolor=3, shape=diamond, style=filled]
+ 34 [label="State 34\n\l 12 expr: expr • '+' expr\l 12 | expr '+' expr •\l 13 | expr • '-' expr\l 14 | expr • '/' expr\l 15 | expr • '*' expr\l"]
+ 34 -> 28 [style=solid label="'*'"]
+ 34 -> 29 [style=solid label="'/'"]
+ 34 -> "34R12" [style=solid]
+ "34R12" [label="R12", fillcolor=3, shape=diamond, style=filled]
+ 35 [label="State 35\n\l 12 expr: expr • '+' expr\l 13 | expr • '-' expr\l 13 | expr '-' expr •\l 14 | expr • '/' expr\l 15 | expr • '*' expr\l"]
+ 35 -> 28 [style=solid label="'*'"]
+ 35 -> 29 [style=solid label="'/'"]
+ 35 -> "35R13" [style=solid]
+ "35R13" [label="R13", fillcolor=3, shape=diamond, style=filled]
+ 36 [label="State 36\n\l 12 expr: expr • '+' expr\l 13 | expr • '-' expr\l 14 | expr • '/' expr\l 15 | expr • '*' expr\l 15 | expr '*' expr •\l"]
+ 36 -> "36R15" [style=solid]
+ "36R15" [label="R15", fillcolor=3, shape=diamond, style=filled]
+ 37 [label="State 37\n\l 12 expr: expr • '+' expr\l 13 | expr • '-' expr\l 14 | expr • '/' expr\l 14 | expr '/' expr •\l 15 | expr • '*' expr\l"]
+ 37 -> "37R14" [style=solid]
+ "37R14" [label="R14", fillcolor=3, shape=diamond, style=filled]
+ 38 [label="State 38\n\l 19 expr: name '(' ')' •\l"]
+ 38 -> "38R19" [style=solid]
+ "38R19" [label="R19", fillcolor=3, shape=diamond, style=filled]
+ 39 [label="State 39\n\l 11 expr: name '=' expr •\l 12 | expr • '+' expr\l 13 | expr • '-' expr\l 14 | expr • '/' expr\l 15 | expr • '*' expr\l"]
+ 39 -> "39R11" [style=solid]
+ "39R11" [label="R11", fillcolor=3, shape=diamond, style=filled]
+ 40 [label="State 40\n\l 9 func: '(' ')' RETTYPE type • '{' decs exprs '}'\l 10 | '(' ')' RETTYPE type • '{' exprs '}'\l"]
+ 40 -> 41 [style=solid label="'{'"]
+ 41 [label="State 41\n\l 9 func: '(' ')' RETTYPE type '{' • decs exprs '}'\l 10 | '(' ')' RETTYPE type '{' • exprs '}'\l"]
+ 41 -> 42 [style=solid label="NAME"]
+ 41 -> 17 [style=solid label="NUMBER"]
+ 41 -> 2 [style=solid label="FUNC"]
+ 41 -> 23 [style=solid label="'('"]
+ 41 -> 43 [style=dashed label="decs"]
+ 41 -> 5 [style=dashed label="dec"]
+ 41 -> 44 [style=dashed label="exprs"]
+ 41 -> 45 [style=dashed label="expr"]
+ 41 -> 21 [style=dashed label="name"]
+ 41 -> 6 [style=dashed label="type"]
+ 42 [label="State 42\n\l 20 name: NAME •\l 21 type: NAME •\l"]
+ 42 -> "42R20" [style=solid]
+ "42R20" [label="R20", fillcolor=3, shape=diamond, style=filled]
+ 42 -> "42R21" [label="[NAME]", style=solid]
+ "42R21" [label="R21", fillcolor=3, shape=diamond, style=filled]
+ 43 [label="State 43\n\l 2 decs: decs • dec ';'\l 9 func: '(' ')' RETTYPE type '{' decs • exprs '}'\l"]
+ 43 -> 42 [style=solid label="NAME"]
+ 43 -> 17 [style=solid label="NUMBER"]
+ 43 -> 2 [style=solid label="FUNC"]
+ 43 -> 23 [style=solid label="'('"]
+ 43 -> 9 [style=dashed label="dec"]
+ 43 -> 46 [style=dashed label="exprs"]
+ 43 -> 45 [style=dashed label="expr"]
+ 43 -> 21 [style=dashed label="name"]
+ 43 -> 6 [style=dashed label="type"]
+ 44 [label="State 44\n\l 7 exprs: exprs • expr ';'\l 10 func: '(' ')' RETTYPE type '{' exprs • '}'\l"]
+ 44 -> 11 [style=solid label="NAME"]
+ 44 -> 17 [style=solid label="NUMBER"]
+ 44 -> 23 [style=solid label="'('"]
+ 44 -> 47 [style=solid label="'}'"]
+ 44 -> 48 [style=dashed label="expr"]
+ 44 -> 21 [style=dashed label="name"]
+ 45 [label="State 45\n\l 8 exprs: expr • ';'\l 12 expr: expr • '+' expr\l 13 | expr • '-' expr\l 14 | expr • '/' expr\l 15 | expr • '*' expr\l"]
+ 45 -> 26 [style=solid label="'+'"]
+ 45 -> 27 [style=solid label="'-'"]
+ 45 -> 28 [style=solid label="'*'"]
+ 45 -> 29 [style=solid label="'/'"]
+ 45 -> 49 [style=solid label="';'"]
+ 46 [label="State 46\n\l 7 exprs: exprs • expr ';'\l 9 func: '(' ')' RETTYPE type '{' decs exprs • '}'\l"]
+ 46 -> 11 [style=solid label="NAME"]
+ 46 -> 17 [style=solid label="NUMBER"]
+ 46 -> 23 [style=solid label="'('"]
+ 46 -> 50 [style=solid label="'}'"]
+ 46 -> 48 [style=dashed label="expr"]
+ 46 -> 21 [style=dashed label="name"]
+ 47 [label="State 47\n\l 10 func: '(' ')' RETTYPE type '{' exprs '}' •\l"]
+ 47 -> "47R10" [style=solid]
+ "47R10" [label="R10", fillcolor=3, shape=diamond, style=filled]
+ 48 [label="State 48\n\l 7 exprs: exprs expr • ';'\l 12 expr: expr • '+' expr\l 13 | expr • '-' expr\l 14 | expr • '/' expr\l 15 | expr • '*' expr\l"]
+ 48 -> 26 [style=solid label="'+'"]
+ 48 -> 27 [style=solid label="'-'"]
+ 48 -> 28 [style=solid label="'*'"]
+ 48 -> 29 [style=solid label="'/'"]
+ 48 -> 51 [style=solid label="';'"]
+ 49 [label="State 49\n\l 8 exprs: expr ';' •\l"]
+ 49 -> "49R8" [style=solid]
+ "49R8" [label="R8", fillcolor=3, shape=diamond, style=filled]
+ 50 [label="State 50\n\l 9 func: '(' ')' RETTYPE type '{' decs exprs '}' •\l"]
+ 50 -> "50R9" [style=solid]
+ "50R9" [label="R9", fillcolor=3, shape=diamond, style=filled]
+ 51 [label="State 51\n\l 7 exprs: exprs expr ';' •\l"]
+ 51 -> "51R7" [style=solid]
+ "51R7" [label="R7", fillcolor=3, shape=diamond, style=filled]
+}
diff --git a/parse.h b/parse.h
@@ -0,0 +1,104 @@
+/* A Bison parser, made by GNU Bison 3.8.2. */
+
+/* Bison interface for Yacc-like parsers in C
+
+ Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2021 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>. */
+
+/* As a special exception, you may create a larger work that contains
+ part or all of the Bison parser skeleton and distribute that work
+ under terms of your choice, so long as that work isn't itself a
+ parser generator using the skeleton or a modified version thereof
+ as a parser skeleton. Alternatively, if you modify or redistribute
+ the parser skeleton itself, you may (at your option) remove this
+ special exception, which will cause the skeleton and the resulting
+ Bison output files to be licensed under the GNU General Public
+ License without this special exception.
+
+ This special exception was added by the Free Software Foundation in
+ version 2.2 of Bison. */
+
+/* DO NOT RELY ON FEATURES THAT ARE NOT DOCUMENTED in the manual,
+ especially those whose name start with YY_ or yy_. They are
+ private implementation details that can be changed or removed. */
+
+#ifndef YY_YY_PARSE_H_INCLUDED
+# define YY_YY_PARSE_H_INCLUDED
+/* Debug traces. */
+#ifndef YYDEBUG
+# define YYDEBUG 1
+#endif
+#if YYDEBUG
+extern int yydebug;
+#endif
+
+/* Token kinds. */
+#ifndef YYTOKENTYPE
+# define YYTOKENTYPE
+ enum yytokentype
+ {
+ YYEMPTY = -2,
+ YYEOF = 0, /* "end of file" */
+ YYerror = 256, /* error */
+ YYUNDEF = 257, /* "invalid token" */
+ NAME = 258, /* NAME */
+ NUMBER = 259, /* NUMBER */
+ FUNC = 260, /* FUNC */
+ RETTYPE = 261 /* RETTYPE */
+ };
+ typedef enum yytokentype yytoken_kind_t;
+#endif
+/* Token kinds. */
+#define YYEMPTY -2
+#define YYEOF 0
+#define YYerror 256
+#define YYUNDEF 257
+#define NAME 258
+#define NUMBER 259
+#define FUNC 260
+#define RETTYPE 261
+
+/* Value type. */
+#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
+union YYSTYPE
+{
+#line 22 "parse.y"
+
+ struct ast_dec *dec;
+ struct ast_expr *expr;
+ struct ast_decs *decs;
+ struct ast_exprs *exprs;
+ struct ast_type *type;
+
+ char *s;
+ long l;
+
+#line 90 "parse.h"
+
+};
+typedef union YYSTYPE YYSTYPE;
+# define YYSTYPE_IS_TRIVIAL 1
+# define YYSTYPE_IS_DECLARED 1
+#endif
+
+
+extern YYSTYPE yylval;
+
+
+int yyparse (void);
+
+
+#endif /* !YY_YY_PARSE_H_INCLUDED */
diff --git a/parse.y b/parse.y
@@ -5,8 +5,12 @@
#include "ast.h"
#include "util.h"
+#define YYDEBUG 1
+
extern char *yytext;
extern int yyleng;
+extern size_t lineno, offset;
+
extern int yylex();
extern void typecheck(struct ast_decs *);
@@ -20,7 +24,7 @@ struct ast_decs *body;
struct ast_expr *expr;
struct ast_decs *decs;
struct ast_exprs *exprs;
- struct func *func;
+ struct ast_type *type;
char *s;
long l;
@@ -28,7 +32,7 @@ struct ast_decs *body;
%token <s> NAME
%token <l> NUMBER
-%token FUNC
+%token FUNC RETTYPE
%type <decs> body
%type <expr> expr
@@ -36,8 +40,8 @@ struct ast_decs *body;
%type <exprs> exprs
%type <dec> dec
%type <decs> decs
+%type <type> type
%type <s> name
-%type <s> type
%left '+' '-'
@@ -106,16 +110,16 @@ exprs : exprs expr ';' {
}
;
-func : FUNC '(' ')' '{' decs exprs '}' {
+func : '(' ')' RETTYPE type '{' decs exprs '}' {
$$ = alloczt(struct ast_expr);
$$->op = FUNCTION;
- $$->decs = $5;
- $$->exprs = $6;
+ $$->decs = $6;
+ $$->exprs = $7;
}
- | FUNC '(' ')' '{' exprs '}' {
+ | '(' ')' RETTYPE type '{' exprs '}' {
$$ = alloczt(struct ast_expr);
$$->op = FUNCTION;
- $$->exprs = $5;
+ $$->exprs = $6;
}
;
@@ -171,7 +175,7 @@ expr : name '=' expr {
$$->op = VAR;
$$->fn = $1;
}
- | name '(' ')' {
+ | name '(' /*args*/ ')' {
$$ = alloczt(struct ast_expr);
$$->op = FUNC;
$$->fn = $1;
@@ -185,16 +189,41 @@ name : NAME {
;
type : NAME {
-
- $$ = strslice($1, yyleng);
+ $$ = alloczt(struct ast_type);
+ $$->t = BASIC_T;
+ $$->type = strslice($1, yyleng);
+ }
+ | FUNC '(' /*params*/ ')' RETTYPE type {
+ $$ = alloczt(struct ast_type);
+ $$->t = FUNCTION_T;
+ $$->ret = $5;
}
;
+/*
+args : args ',' arg
+ | arg
+ ;
+
+arg : type NAME
+ ;
+
+
+params : params ',' param
+ | param
+ ;
+
+param : type NAME
+ ;
+*/
%%
int
yyerror(const char *msg) {
- fprintf(stderr, "err: \'%s\', %s\n", yytext, msg);
- return 1;
+ if (strcmp(msg, "syntax error") == 0) {
+ fprintf(stderr, "%d:%d: syntax error: %s\n", lineno + 1, offset - yyleng, yytext);
+ }
+ else
+ fprintf(stderr, "%s\n", msg);
}
int
diff --git a/test.fe b/test.fe
@@ -1,2 +1,4 @@
-int a = 5;
-int b = a + 3;
+func() -> int main =
+(int a) -> int {
+ rand();
+};
diff --git a/types.c b/types.c
@@ -16,7 +16,7 @@ const char *
typeof_expr(struct ast_expr *expr) {
switch (expr->op) {
case VALUE:
- return "int";
+ return "long";
case ADD:
case SUB:
case DIV:
@@ -36,8 +36,6 @@ typeof_expr(struct ast_expr *expr) {
void
typecheck_dec(struct ast_dec *dec) {
- if (!SAME(typeof_expr(dec->value), dec->type))
- type_error(typeof_expr(dec->value), dec->type);
}
void