Welcome, guest! Login / Register - Why register?
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
Your Name: Code Language: