Subversion Repositories programming

Rev

Rev 228 | Rev 231 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
225 ira 1
/*******************************************************************************
2
 * File: jminus.y
3
 * 
4
 * Copyright (c) 2006, Ira W. Snyder (devel@irasnyder.com)
5
 * License: GNU General Public License v2
229 ira 6
 *
7
 * This file contains a definition of the J-Minus language, and will
8
 * create a parser for the language when compiled using BYACC/J, which
9
 * is available from http://byaccj.sourceforge.net.
225 ira 10
 ******************************************************************************/
11
 
12
%{
13
    import java.lang.*;
14
    import java.io.*;
226 ira 15
    import java.util.StringTokenizer;
225 ira 16
%}
17
 
18
/* Token Declarations */
19
%token CLASS
20
%token ID
21
%token PUBLIC
22
%token PRIVATE
23
%token INT
24
%token FLOAT
25
%token VOID
26
%token IF
27
%token ELSE
28
%token WHILE
29
%token RETURN
30
%token ADDOP
31
%token MULOP
32
%token NUM
33
%token LPAREN
34
%token RPAREN
35
%token LBRACE
36
%token RBRACE
37
%token SEMI
38
%token ASSIGNOP
39
 
229 ira 40
/* J-Minus Grammar */
225 ira 41
%%
42
program : modifier CLASS ID LBRACE method_declaration RBRACE
228 ira 43
        { System.out.println ("program -> modifier class id { method_declaration }"); };
225 ira 44
 
228 ira 45
modifier : PUBLIC   { System.out.println ("modifier -> public"); }
46
    | PRIVATE       { System.out.println ("modifier -> private"); };
225 ira 47
 
228 ira 48
method_declaration : modifier type_specifier ID LPAREN param RPAREN
49
    LBRACE local_declaration stmt_sequence RBRACE
50
        { System.out.println ("method_declaration -> modifier type_specifier id (param) "
51
                             +"{ local_declaration stmt_sequence }"); };
225 ira 52
 
228 ira 53
type_specifier : INT { System.out.println ("type_specifier -> int"); }
54
    | FLOAT { System.out.println ("type_specifier -> float"); }
55
    | VOID  { System.out.println ("type_specifier -> void"); };
225 ira 56
 
228 ira 57
param : type_specifier ID { System.out.println ("param -> type_specifier id"); }
58
    | VOID  { System.out.println ("param -> void"); };
225 ira 59
 
228 ira 60
local_declaration : type_specifier ID SEMI
61
            { System.out.println ("local_declaration -> id;"); }
62
    |       { System.out.println ("local_declaration -> epsilon"); };
225 ira 63
 
228 ira 64
stmt_sequence : stmt_sequence statement
65
                { System.out.println ("stmt_sequence -> stmt_sequence statement"); }
66
    | statement { System.out.println ("stmt_sequence -> statement"); };
225 ira 67
 
228 ira 68
statement : if_stmt { System.out.println ("statement -> if_stmt"); }
69
    | while_stmt    { System.out.println ("statement -> while_stmt"); }
70
    | assign_stmt   { System.out.println ("statement -> assign_stmt"); }
71
    | return_stmt   { System.out.println ("statement -> return_stmt"); }
72
    | expr_stmt     { System.out.println ("statement -> expr_stmt"); };
225 ira 73
 
228 ira 74
if_stmt : IF LPAREN exp RPAREN statement ELSE statement
75
        { System.out.println ("if_stmt -> if (exp) statement else statement"); };
225 ira 76
 
228 ira 77
while_stmt : WHILE LPAREN exp RPAREN statement
78
        { System.out.println ("while_stmt -> (exp) statement"); };
225 ira 79
 
228 ira 80
assign_stmt : ID ASSIGNOP exp SEMI
81
        { System.out.println ("assign_stmt -> id = exp;"); };
225 ira 82
 
228 ira 83
return_stmt : RETURN exp SEMI   { System.out.println ("return_stmt -> return exp;"); }
84
    | RETURN SEMI               { System.out.println ("return_stmt -> return;"); };
225 ira 85
 
228 ira 86
expr_stmt : exp SEMI            { System.out.println ("expr_stmt -> exp;"); };
225 ira 87
 
228 ira 88
exp : exp ADDOP term            { System.out.println ("exp -> exp + term"); }
89
    | term                      { System.out.println ("exp -> term"); };
225 ira 90
 
228 ira 91
term : term MULOP factor        { System.out.println ("term -> term * factor"); }
92
    | factor                    { System.out.println ("term -> factor"); };
225 ira 93
 
228 ira 94
factor : LPAREN exp RPAREN      { System.out.println ("factor -> (exp)"); }
95
    | ADDOP factor              { System.out.println ("factor -> + factor"); }
96
    | NUM                       { System.out.println ("factor -> NUM"); }
97
    | ID                        { System.out.println ("factor -> ID"); };
225 ira 98
 
99
%%
100
 
226 ira 101
private Yylex lexer;
225 ira 102
 
226 ira 103
public void yyerror (String error)
104
{
105
    System.out.println ("Parse Error: " + error);
106
}
225 ira 107
 
226 ira 108
int yylex ()
109
{
110
    int lex_return = -1;
111
 
112
    try
113
    {
114
        lex_return = lexer.yylex();
115
    }
116
    catch (IOException e)
117
    {
118
        System.out.println ("IO Error: " + e);
119
    }
120
 
121
    return lex_return;
122
}
123
 
124
public Parser (Reader r)
125
{
126
    lexer = new Yylex (r, this);
127
}
128
 
129
public static void main (String[] args) throws Exception
130
{
131
    Parser yyparser = new Parser (new FileReader (args[0]));
132
    yyparser.yyparse();
133
}
134