161 lines
3.8 KiB
Plaintext
161 lines
3.8 KiB
Plaintext
/*
|
|
* [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 '^'<assoc=right>^ e
|
|
| e '|'^ e
|
|
| e '&&'^ e
|
|
| e '||'^ e
|
|
// | e '?' e ':' e
|
|
| e ('='<assoc=right>^
|
|
|'+='<assoc=right>^
|
|
|'-='<assoc=right>^
|
|
|'*='<assoc=right>^
|
|
|'/='<assoc=right>^
|
|
|'&='<assoc=right>^
|
|
|'|='<assoc=right>^
|
|
|'^='<assoc=right>^
|
|
|'>>='<assoc=right>^
|
|
|'>>>='<assoc=right>^
|
|
|'<<='<assoc=right>^
|
|
|'<<<='<assoc=right>^
|
|
|'%='<assoc=right>^) 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'+
|
|
;
|