1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
|
/*
* Make sure to run antlr.Tool on the lexer.g file first!
*/
options {
mangleLiteralPrefix = "TK_";
}
{
import java.io.*;
class Main {
public static void main(String[] args) {
try {
TinyCLexer lexer = new TinyCLexer(new DataInputStream(System.in));
TinyCParser parser = new TinyCParser(lexer);
parser.program();
} catch(Exception e) {
System.err.println("exception: "+e);
}
}
}
}
class TinyCParser extends Parser;
options {
importVocab=TinyC; // use vocab generated by lexer
}
program
: ( declaration )* EOF
;
declaration
: (variable) => variable
| function
;
declarator
: id:ID
| STAR id2:ID
;
variable
: type declarator SEMI
;
function
: type id:ID LPAREN
(formalParameter (COMMA formalParameter)*)?
RPAREN
block
;
formalParameter
: type declarator
;
type:
(
TK_int
| TK_char
| id:ID
)
;
block
: LCURLY ( statement )* RCURLY
;
statement
: (declaration) => declaration
| expr SEMI
| TK_if LPAREN expr RPAREN statement
( TK_else statement )?
| TK_while LPAREN expr RPAREN statement
| block
;
expr: assignExpr
;
assignExpr
: aexpr (ASSIGN assignExpr)?
;
aexpr
: mexpr (PLUS mexpr)*
;
mexpr
: atom (STAR atom)*
;
atom: ID
| INT
| CHAR_LITERAL
| STRING_LITERAL
;
|