1/*
2 * [The "BSD licence"]
3 * Copyright (c) 2005-2008 Terence Parr
4 * All rights reserved.
5 *
6 * Conversion to C#:
7 * Copyright (c) 2008-2009 Sam Harwell, Pixel Mine, Inc.
8 * All rights reserved.
9 *
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
12 * are met:
13 * 1. Redistributions of source code must retain the above copyright
14 *    notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 *    notice, this list of conditions and the following disclaimer in the
17 *    documentation and/or other materials provided with the distribution.
18 * 3. The name of the author may not be used to endorse or promote products
19 *    derived from this software without specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
22 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
23 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
24 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
25 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
26 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
30 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 */
32
33grammar ProfileGrammar;
34
35options
36{
37	language=CSharp3;
38	output=AST;
39	ASTLabelType=CommonTree;
40}
41
42tokens
43{
44	// define pseudo-operations
45	FUNC;
46	CALL;
47}
48
49// START:stat
50prog: ( stat )*
51    ;
52
53stat:   expr NEWLINE                    -> expr
54    |   ID '=' expr NEWLINE             -> ^('=' ID expr)
55    |   func NEWLINE                    -> func
56    |   NEWLINE                         -> // ignore
57    ;
58
59func:   ID  '(' formalPar ')' '=' expr  -> ^(FUNC ID formalPar expr)
60    ;
61	finally {
62	  functionDefinitions.Add($func.tree);
63	}
64
65formalPar
66    :   ID
67	|   INT
68	;
69
70// END:stat
71
72// START:expr
73expr:   multExpr (('+'^|'-'^) multExpr)*
74    ;
75
76multExpr
77    :   atom (('*'|'/'|'%')^ atom)*
78    ;
79
80atom:   INT
81    |   ID
82    |   '(' expr ')'    -> expr
83    |   ID '(' expr ')' -> ^(CALL ID expr)
84    ;
85// END:expr
86
87// START:tokens
88ID  :   ('a'..'z'|'A'..'Z')+
89	;
90
91INT :   '0'..'9'+
92    ;
93
94NEWLINE
95    :	'\r'? '\n'
96    ;
97
98WS  :   (' '|'\t')+ { Skip(); }
99    ;
100// END:tokens
101