/* * [The "BSD licence"] * Copyright (c) 2011 Terence Parr * All rights reserved. * * Conversion to C#: * Copyright (c) 2011 Sam Harwell, Pixel Mine, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ grammar TestExpressionFeatures; options { language=CSharp3; TokenLabelType=CommonToken; output=AST; ASTLabelType=CommonTree; } tokens { LPAREN = '('; RPAREN = ')'; DOT = '.'; LBRACK = '['; RBRACK = ']'; INC = '++'; DEC = '--'; PLUS = '+'; MINUS = '-'; TILDE = '~'; NOT = '!'; //LSHIFT = '<<'; //RSHIFT = '>>'; //RUSHIFT = '>>>'; EQUALS = '=='; NOTEQ = '!='; MOD = '%'; CARET = '^'; GT = '>'; LT = '<'; GE = '>='; LE = '<='; BITAND = '&'; BITOR = '|'; AND = '&&'; OR = '||'; KW_THIS = 'this'; KW_SUPER = 'super'; KW_CLASS = 'class'; KW_NEW = 'new'; KW_INSTANCEOF = 'instanceof'; KW_INT = 'int'; } @lexer::namespace{Antlr3.Runtime.Test} @parser::namespace{Antlr3.Runtime.Test} @parser::header{using Console = System.Console;} /* * Parser Rules */ public compileUnit : e EOF ; e : '('! e ')'! | 'this' | 'super' | INT | ID | type '.'^ 'class' | e '.'^ ID | e '.'^ 'this' | e '.'^ 'super' '('^ expressionList? ')'! | e '.'^ 'new'^ ID '('! expressionList? ')'! | 'new'^ type ( '(' expressionList? ')'! | (options {k=1;}:'[' e ']'!)+) | e '['^ e ']'! | '('^ type ')'! e | e ('++'^ | '--'^) | e '('^ expressionList? ')'! | ('+'^|'-'^|'++'^|'--'^) e | ('~'^|'!'^) e | e ('*'^|'/'^|'%'^) e | e ('+'^|'-'^) e | e ('<' '<' | '>' '>' '>' | '>' '>') e | e ('<='^ | '>='^ | '>'^ | '<'^) e | e 'instanceof'^ e | e ('=='^ | '!='^) e | e '&'^ e | e '^'^ e | e '|'^ e | e '&&'^ e | e '||'^ e // | e '?' e ':' e | e ('='^ |'+='^ |'-='^ |'*='^ |'/='^ |'&='^ |'|='^ |'^='^ |'>>='^ |'>>>='^ |'<<='^ |'<<<='^ |'%='^) e ; expressionList : e (','! e)* ; type: ID | ID '['^ ']'! | 'int' | 'int' '['^ ']'! ; /* * Lexer Rules */ WS : (' ' | '\t' | '\n' | '\r') {Skip();} ; ID : ('a'..'z' | 'A'..'Z' | '_') ('a'..'z' | 'A'..'Z' | '0'..'9' | '_')* ; INT : '0'..'9'+ ;