fela

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

commit ca8634bcf5e28e3656f7f718319042662873b30a
parent 5d85ad48ff9492b53d3550ce3280cbde8449b417
Author: thing1 <l.standen@posteo.com>
Date:   Wed, 29 Oct 2025 21:26:11 +0000

improved the type system

Diffstat:
MMakefile | 8+++++---
Mast.h | 21++++++++++++++++++++-
Mconfig.mk | 4++--
Mlex.l | 14++++++++++++--
Aparse.gv | 238+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aparse.h | 104+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mparse.y | 55++++++++++++++++++++++++++++++++++++++++++-------------
Mtest.fe | 6++++--
Mtypes.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