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 Expr; 34 35/* 36 I had to make the following changes to the basic Expr grammar to make it work with the CSharp3 target in "Java compatibility mode". 37 For reference, see http://www.antlr.org/wiki/display/ANTLR3/Expression+evaluator. 38 39 Add an options section to set the language to CSharp3. 40 41 In the @header section, add: 42 // 'member' is obsolete 43 #pragma warning disable 612 44 using Antlr.Runtime.JavaExtensions; 45 46 In the @header section, replace: 47 import java.util.HashMap; 48 with: 49 using HashMap = System.Collections.Generic.Dictionary<object,object>; 50 51 Change all instances of "System.out" with "JSystem.@out". 52 53 Change all instances of "System.err" with "JSystem.err". 54 55 Change all instances of "skip()" with "Skip()". 56 */ 57 58options 59{ 60 language=CSharp3; 61} 62 63@header { 64// 'member' is obsolete 65#pragma warning disable 612 66 67using Antlr.Runtime.JavaExtensions; 68using HashMap = System.Collections.Generic.Dictionary<object,object>; 69using Integer = java.lang.Integer; 70} 71 72@members { 73/** Map variable name to Integer object holding value */ 74HashMap memory = new HashMap(); 75} 76 77prog: stat+ ; 78 79stat: expr NEWLINE {JSystem.@out.println($expr.value);} 80 | ID '=' expr NEWLINE 81 {memory.put($ID.text, new Integer($expr.value));} 82 | NEWLINE 83 ; 84 85expr returns [int value] 86 : e=multExpr {$value = $e.value;} 87 ( '+' e=multExpr {$value += $e.value;} 88 | '-' e=multExpr {$value -= $e.value;} 89 )* 90 ; 91 92multExpr returns [int value] 93 : e=atom {$value = $e.value;} ('*' e=atom {$value *= $e.value;})* 94 ; 95 96atom returns [int value] 97 : INT {$value = Integer.parseInt($INT.text);} 98 | ID 99 { 100 Integer v = (Integer)memory.get($ID.text); 101 if ( v!=null ) $value = v.intValue(); 102 else JSystem.err.println("undefined variable "+$ID.text); 103 } 104 | '(' expr ')' {$value = $expr.value;} 105 ; 106 107ID : ('a'..'z'|'A'..'Z')+ ; 108INT : '0'..'9'+ ; 109NEWLINE:'\r'? '\n' ; 110WS : (' '|'\t')+ {Skip();} ; 111