Subversion Repositories programming

Rev

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();
}