1/* 2 * [The "BSD licence"] 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 TestExpressionFeatures; 34 35options { 36 language=CSharp3; 37 TokenLabelType=CommonToken; 38 output=AST; 39 ASTLabelType=CommonTree; 40} 41 42tokens { 43 LPAREN = '('; 44 RPAREN = ')'; 45 DOT = '.'; 46 LBRACK = '['; 47 RBRACK = ']'; 48 INC = '++'; 49 DEC = '--'; 50 PLUS = '+'; 51 MINUS = '-'; 52 TILDE = '~'; 53 NOT = '!'; 54 //LSHIFT = '<<'; 55 //RSHIFT = '>>'; 56 //RUSHIFT = '>>>'; 57 EQUALS = '=='; 58 NOTEQ = '!='; 59 MOD = '%'; 60 CARET = '^'; 61 GT = '>'; 62 LT = '<'; 63 GE = '>='; 64 LE = '<='; 65 BITAND = '&'; 66 BITOR = '|'; 67 AND = '&&'; 68 OR = '||'; 69 70 KW_THIS = 'this'; 71 KW_SUPER = 'super'; 72 KW_CLASS = 'class'; 73 KW_NEW = 'new'; 74 KW_INSTANCEOF = 'instanceof'; 75 KW_INT = 'int'; 76} 77 78@lexer::namespace{Antlr3.Runtime.Test} 79@parser::namespace{Antlr3.Runtime.Test} 80 81@parser::header{using Console = System.Console;} 82 83/* 84 * Parser Rules 85 */ 86 87public 88compileUnit 89 : e EOF 90 ; 91 92e : '('! e ')'! 93 | 'this' 94 | 'super' 95 | INT 96 | ID 97 | type '.'^ 'class' 98 | e '.'^ ID 99 | e '.'^ 'this' 100 | e '.'^ 'super' '('^ expressionList? ')'! 101 | e '.'^ 'new'^ ID '('! expressionList? ')'! 102 | 'new'^ type ( '(' expressionList? ')'! | (options {k=1;}:'[' e ']'!)+) 103 | e '['^ e ']'! 104 | '('^ type ')'! e 105 | e ('++'^ | '--'^) 106 | e '('^ expressionList? ')'! 107 | ('+'^|'-'^|'++'^|'--'^) e 108 | ('~'^|'!'^) e 109 | e ('*'^|'/'^|'%'^) e 110 | e ('+'^|'-'^) e 111 | e ('<' '<' | '>' '>' '>' | '>' '>') e 112 | e ('<='^ | '>='^ | '>'^ | '<'^) e 113 | e 'instanceof'^ e 114 | e ('=='^ | '!='^) e 115 | e '&'^ e 116 | e '^'<assoc=right>^ e 117 | e '|'^ e 118 | e '&&'^ e 119 | e '||'^ e 120// | e '?' e ':' e 121 | e ('='<assoc=right>^ 122 |'+='<assoc=right>^ 123 |'-='<assoc=right>^ 124 |'*='<assoc=right>^ 125 |'/='<assoc=right>^ 126 |'&='<assoc=right>^ 127 |'|='<assoc=right>^ 128 |'^='<assoc=right>^ 129 |'>>='<assoc=right>^ 130 |'>>>='<assoc=right>^ 131 |'<<='<assoc=right>^ 132 |'<<<='<assoc=right>^ 133 |'%='<assoc=right>^) e 134 ; 135 136expressionList 137 : e (','! e)* 138 ; 139 140type: ID 141 | ID '['^ ']'! 142 | 'int' 143 | 'int' '['^ ']'! 144 ; 145 146/* 147 * Lexer Rules 148 */ 149 150WS 151 : (' ' | '\t' | '\n' | '\r') {Skip();} 152 ; 153 154ID 155 : ('a'..'z' | 'A'..'Z' | '_') ('a'..'z' | 'A'..'Z' | '0'..'9' | '_')* 156 ; 157 158INT 159 : '0'..'9'+ 160 ; 161