1/* 2 * [The "BSD license"] 3 * Copyright (c) 2011 Terence Parr 4 * All rights reserved. 5 * 6 * Conversion to C#: 7 * Copyright (c) 2011 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 77@lexer::namespace{Antlr3.Runtime.Test.JavaCompat} 78@parser::namespace{Antlr3.Runtime.Test.JavaCompat} 79 80prog: stat+ ; 81 82stat: expr NEWLINE {JSystem.@out.println($expr.value);} 83 | ID '=' expr NEWLINE 84 {memory.put($ID.text, new Integer($expr.value));} 85 | NEWLINE 86 ; 87 88expr returns [int value] 89 : e=multExpr {$value = $e.value;} 90 ( '+' e=multExpr {$value += $e.value;} 91 | '-' e=multExpr {$value -= $e.value;} 92 )* 93 ; 94 95multExpr returns [int value] 96 : e=atom {$value = $e.value;} ('*' e=atom {$value *= $e.value;})* 97 ; 98 99atom returns [int value] 100 : INT {$value = Integer.parseInt($INT.text);} 101 | ID 102 { 103 Integer v = (Integer)memory.get($ID.text); 104 if ( v!=null ) $value = v.intValue(); 105 else JSystem.err.println("undefined variable "+$ID.text); 106 } 107 | '(' expr ')' {$value = $expr.value;} 108 ; 109 110ID : ('a'..'z'|'A'..'Z')+ ; 111INT : '0'..'9'+ ; 112NEWLINE:'\r'? '\n' ; 113WS : (' '|'\t')+ {Skip();} ; 114