Subversion Repositories programming

Rev

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