Rev 228 | Rev 231 | 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** This file contains a definition of the J-Minus language, and will* create a parser for the language when compiled using BYACC/J, which* is available from http://byaccj.sourceforge.net.******************************************************************************/%{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/* J-Minus Grammar */%%program : modifier CLASS ID LBRACE method_declaration RBRACE{ System.out.println ("program -> modifier class id { method_declaration }"); };modifier : PUBLIC { System.out.println ("modifier -> public"); }| PRIVATE { System.out.println ("modifier -> private"); };method_declaration : modifier type_specifier ID LPAREN param RPARENLBRACE local_declaration stmt_sequence RBRACE{ System.out.println ("method_declaration -> modifier type_specifier id (param) "+"{ local_declaration stmt_sequence }"); };type_specifier : INT { System.out.println ("type_specifier -> int"); }| FLOAT { System.out.println ("type_specifier -> float"); }| VOID { System.out.println ("type_specifier -> void"); };param : type_specifier ID { System.out.println ("param -> type_specifier id"); }| VOID { System.out.println ("param -> void"); };local_declaration : type_specifier ID SEMI{ System.out.println ("local_declaration -> id;"); }| { System.out.println ("local_declaration -> epsilon"); };stmt_sequence : stmt_sequence statement{ System.out.println ("stmt_sequence -> stmt_sequence statement"); }| statement { System.out.println ("stmt_sequence -> statement"); };statement : if_stmt { System.out.println ("statement -> if_stmt"); }| while_stmt { System.out.println ("statement -> while_stmt"); }| assign_stmt { System.out.println ("statement -> assign_stmt"); }| return_stmt { System.out.println ("statement -> return_stmt"); }| expr_stmt { System.out.println ("statement -> expr_stmt"); };if_stmt : IF LPAREN exp RPAREN statement ELSE statement{ System.out.println ("if_stmt -> if (exp) statement else statement"); };while_stmt : WHILE LPAREN exp RPAREN statement{ System.out.println ("while_stmt -> (exp) statement"); };assign_stmt : ID ASSIGNOP exp SEMI{ System.out.println ("assign_stmt -> id = exp;"); };return_stmt : RETURN exp SEMI { System.out.println ("return_stmt -> return exp;"); }| RETURN SEMI { System.out.println ("return_stmt -> return;"); };expr_stmt : exp SEMI { System.out.println ("expr_stmt -> exp;"); };exp : exp ADDOP term { System.out.println ("exp -> exp + term"); }| term { System.out.println ("exp -> term"); };term : term MULOP factor { System.out.println ("term -> term * factor"); }| factor { System.out.println ("term -> factor"); };factor : LPAREN exp RPAREN { System.out.println ("factor -> (exp)"); }| ADDOP factor { System.out.println ("factor -> + factor"); }| NUM { System.out.println ("factor -> NUM"); }| ID { System.out.println ("factor -> ID"); };%%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();}