Rev 225 | Rev 228 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
/******************************************************************************** File: jminus.y** Copyright (c) 2006, Ira W. Snyder (devel@irasnyder.com)* License: GNU General Public License v2*******************************************************************************/%{import java.lang.*;import java.io.*;import java.util.StringTokenizer;%}/* Token Declarations */%token CLASS%token ID%token PUBLIC%token PRIVATE%token INT%token FLOAT%token VOID%token IF%token ELSE%token WHILE%token RETURN%token ADDOP%token MULOP%token NUM%token LPAREN%token RPAREN%token LBRACE%token RBRACE%token SEMI%token ASSIGNOP/* JMinus Grammar */%%program : modifier CLASS ID LBRACE method_declaration RBRACE{ System.out.println ("program reduce"); };modifier : PUBLIC { System.out.println ("modifier reduce"); }| PRIVATE { System.out.println ("modifier reduce"); };method_declaration : modifier type_specifier ID LPAREN param RPAREN LBRACE local_declaration stmt_sequence RBRACE{ System.out.println ("method_declaration reduce"); };type_specifier : INT { System.out.println ("type_specifier -> INT reduce"); }| FLOAT { System.out.println ("type_specifier -> INT reduce"); }| VOID { System.out.println ("type_specifier -> INT reduce"); };param : type_specifier ID { System.out.println ("param reduce"); }| VOID { System.out.println ("param -> VOID reduce"); };local_declaration : type_specifier ID SEMI { System.out.println ("local_declaration reduce"); }| { System.out.println ("local_declaration -> epsilon reduce"); };stmt_sequence : stmt_sequence statement { System.out.println ("stmt_sequence reduce"); }| statement { System.out.println ("stmt_sequence -> statement reduce"); };statement : if_stmt { System.out.println ("statement -> if_stmt reduce"); }| while_stmt { System.out.println ("statement -> while_stmt reduce"); }| assign_stmt { System.out.println ("statement -> assign_stmt reduce"); }| return_stmt { System.out.println ("statement -> return_stmt reduce"); }| expr_stmt { System.out.println ("statement -> expr_stmt reduce"); };if_stmt : IF LPAREN exp RPAREN statement ELSE statement { System.out.println ("if_stmt reduce"); };while_stmt : WHILE LPAREN exp RPAREN statement { System.out.println ("while_stmt reduce"); };assign_stmt : ID ASSIGNOP exp SEMI { System.out.println ("assign_stmt reduce"); };return_stmt : RETURN exp SEMI { System.out.println ("return_stmt -> RETURN exp ; reduce"); }| RETURN SEMI { System.out.println ("return_stmt -> RETURN ; reduce"); };expr_stmt : exp SEMI { System.out.println ("expr_stmt -> exp ; reduce"); };exp : exp ADDOP term { System.out.println ("exp -> exp + term reduce"); }| term { System.out.println ("exp -> term reduce"); };term : term MULOP factor { System.out.println ("term -> term * factor reduce"); }| factor { System.out.println ("term -> factor reduce"); };factor : LPAREN exp RPAREN { System.out.println ("factor -> ( exp ) reduce"); }| ADDOP factor { System.out.println ("factor -> + factor reduce"); }| NUM { System.out.println ("factor -> NUM reduce"); }| ID { System.out.println ("factor -> ID reduce"); };%%private Yylex lexer;public void yyerror (String error){System.out.println ("Parse Error: " + error);}int yylex (){int lex_return = -1;try{lex_return = lexer.yylex();}catch (IOException e){System.out.println ("IO Error: " + e);}return lex_return;}public Parser (Reader r){lexer = new Yylex (r, this);}public static void main (String[] args) throws Exception{Parser yyparser = new Parser (new FileReader (args[0]));yyparser.yyparse();}