From 896e4859333c6be801391ae9bbeec425f6e32f86 Mon Sep 17 00:00:00 2001 From: Akshay Date: Fri, 7 May 2021 10:37:28 +0530 Subject: add prog 12: function definition --- 12/input | 6 ++++ 12/main.l | 44 ++++++++++++++++++++++++ 12/main.y | 112 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ flake.nix | 1 + 4 files changed, 163 insertions(+) create mode 100644 12/input create mode 100644 12/main.l create mode 100644 12/main.y diff --git a/12/input b/12/input new file mode 100644 index 0000000..fa64ab2 --- /dev/null +++ b/12/input @@ -0,0 +1,6 @@ +int main(int a, int b, int c) { + if (a > b) { + for(;;); + a++; + } +} diff --git a/12/main.l b/12/main.l new file mode 100644 index 0000000..2fa1b44 --- /dev/null +++ b/12/main.l @@ -0,0 +1,44 @@ +%{ +extern int yylval; +%} + +%% +"void" return VOID; +"int" return INT; +"float" return FLOAT; +"double" return DOUBLE; +"char" return CHAR; +"unsigned" return UNSIGNED; +"long" return LONG; +"return" return RET; +"for" return FOR; +"if" return IF; +"else" return ELSE; +"," return COMMA; +"(" return LPAREN; +")" return RPAREN; +"{" return LBRACE; +"}" return RBRACE; +";" return ENDL; +"++" return INC; +"--" return DEC; +"+" return ADD; +"-" return SUB; +"*" return MUL; +"/" return DIV; +"=" return ASSIGN; +"==" return EQ; +"!=" return NEQ; +"<" return LT; +">" return GT; +"<=" return LTE; +">=" return GTE; +[a-zA-Z_][a-zA-Z_0-9]* return ID; +. ; +\n ; +<> return 0; +%% + +int yywrap() { + return 1; +} diff --git a/12/main.y b/12/main.y new file mode 100644 index 0000000..5431c55 --- /dev/null +++ b/12/main.y @@ -0,0 +1,112 @@ +%{ +#include +#include +int yylex(); +int yyerror(char *); +%} + +%token ADD SUB MUL DIV INC DEC +%token LT GT LTE GTE EQ NEQ ASSIGN +%token VOID INT DOUBLE FLOAT CHAR +%token LONG UNSIGNED +%token COMMA LPAREN RPAREN LBRACE RBRACE +%token ENDL +%token FOR RET IF ELSE WHILE +%token NUM ID + +%start function_definition + +%% +type_modifier: LONG + | UNSIGNED + ; + +type_specifier: VOID + | CHAR + | INT + | FLOAT + | DOUBLE + | type_modifier type_specifier + ; + +argument: type_specifier ID + ; + +argument_list: argument + | argument COMMA argument_list + ; + +primary_expr: NUM + | ID + ; + +postfix_expr: postfix_expr INC + | postfix_expr DEC + | primary_expr + ; + +unary_expr: INC unary_expr + | DEC unary_expr + | postfix_expr + ; + +boolean_expr: unary_expr LT unary_expr + | unary_expr GT unary_expr + | unary_expr LTE unary_expr + | unary_expr GTE unary_expr + | unary_expr EQ unary_expr + | unary_expr NEQ unary_expr + ; + +assignment_expr: unary_expr ASSIGN unary_expr + | unary_expr ASSIGN boolean_expr + ; + +expression: unary_expr + | boolean_expr + | assignment_expr + ; + +for_expr: FOR LPAREN statement statement expression RPAREN statement + | FOR LPAREN statement statement RPAREN statement + ; + +while_expr: WHILE LPAREN expression RPAREN block + | WHILE LPAREN RPAREN block + ; + +if_expr: IF LPAREN expression RPAREN block + | IF LPAREN expression RPAREN block ELSE block + | IF LPAREN expression RPAREN block ELSE if_expr + ; + +block: LBRACE statement block_cont + ; + +block_cont: statement block_cont + | RBRACE + ; + +statement: RET expression ENDL + | expression ENDL + | block + | for_expr + | if_expr + | while_expr + | ENDL + ; + +function_definition: argument LPAREN argument_list RPAREN block + | argument LPAREN RPAREN block + ; +%% + +int main() { + yyparse(); + printf("valid expression"); +} + +int yyerror(char *s) { + printf("error: %s", s); + exit(0); +} diff --git a/flake.nix b/flake.nix index 17cceb1..fb2e2cb 100644 --- a/flake.nix +++ b/flake.nix @@ -24,6 +24,7 @@ { name = "09"; yacc = true; } { name = "10"; yacc = true; } { name = "11"; yacc = true; } + { name = "12"; yacc = true; } ]; apps = builtins.listToAttrs (builtins.map (def: -- cgit v1.2.3