Psst.. new poll here.
Psst.. new forums here.
Microsoft is blocking us again (TY IP Reputation!) so just use oauth login instead. :)
Paste
Pasted as Plain Text by beelsebob ( 17 years ago )
%{
#include "tokens.h"
#include <stdio.h>
int regs['z'-'a'+1];
%}
%error-verbose
%token tNL
%token tId tNum
%token tPlus tMinus tDiv tMul
%token tLpar tRpar tLCurly tRCurly tComma tDotComma tSingleQuote
%token tOpOr tOpAnd tOpGt tOpLt tOpGtOrEq tOpLtOrEq tOpNeg tOpRem tOpEqEq tOpNotEq tEq
%token tint tchar tvoid tif telse twhile treturn
%token tComment
%token tUMinus
%token exp
%token YY ZZ
%%
slist : slist stmt ';' { printf("** stmt\n"); }
| stmt ';' { yyerrok; printf("** stmt\n"); }
;
stmt : prog
| error
;
prog : /* empty */
| decl
;
decl : typed_decl
;
/* variable declarations */
var_decl : var_init_list tDotComma
;
var_init_list : var_init
|var_init tComma var_init
;
var_init : tId tEq constant
;
constant : tNum
| tchar
;
/* functions */
func_decl : func_head func_tail
;
func_head : func_type tId tLpar formals tRpar
;
typed_decl : var_type untyped_decl;
;
untyped_decl : var_decl | func_decl
;
var_type : tint
| tchar
;
func_type : tvoid | tint |tchar
;
formals : var_type tId
| var_type tComma var_type tId {printf("%s",$$);}
;
func_tail : compound_stmt
| tDotComma
;
/* statements */
statement : expr_stmt
| if_stmt
| while_stmt
| return_stmt
| compound_stmt
;
expr_stmt : expression tDotComma;
;
if_stmt : tif tLpar expression tRpar compound_stmt telse compound_stmt
;
while_stmt : twhile tLpar expression tRpar statement
;
return_stmt : treturn expr_stmt
;
compound_stmt : tLCurly var_decl statement tRCurly;
|tLCurly tRCurly
/* expressions */
/* assignment has lowest presedence */
expression : tId tEq expression
| or_expr
;
or_expr : and_expr tOpOr and_expr
| and_expr
;
and_expr : equal_expr tOpAnd equal_expr
| equal_expr
;
equal_expr : compare_expr equal_op compare_expr
| compare_expr
;
equal_op : tOpEqEq
| tOpNotEq
;
compare_expr : add_expr
| add_expr compare_op add_expr
;
compare_op : tOpGt
| tOpGtOrEq
| tOpLt
| tOpLtOrEq
;
add_expr :mult_expr
| mult_expr add_op mult_expr
;
add_op : tPlus
| tMinus
;
mult_expr : unary_expr
| unary_expr mult_op unary_expr
;
mult_op : tMul
| tDiv
| tOpRem
;
unary_expr : unary_op primary;
unary_op : tOpNeg
| tUMinus
;
primary : tId
| constant
| tId tLpar expression tComma expression tRpar
| tId tLpar expression tRpar
| tLpar expression tRpar
;
%%
make
bison -d -v parser.y
parser.y: conflicts: 2 reduce/reduce
parser.y:60.21-24: warning: rule never reduced because of conflicts: func_type: tint
parser.y:60.27-31: warning: rule never reduced because of conflicts: func_type: tchar
mv parser.tab.c parser.c
mv parser.tab.h tokens.h
gcc -g -c -o parser.o parser.c
lex scanner.l
mv lex.yy.c scanner.c
gcc -g -c -o scanner.o scanner.c
gcc -g -c -o main.o main.c
gcc -g -o scanner parser.o scanner.o main.o -ll
Revise this Paste
Parent: 12002
Children: 12004