blob: f882e3914ae5d7b4da449403539c07f5e8107ccb [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008 The University of York.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Dimitrios Kolovos - initial API and implementation
* -----------------------------------------------------------------------------
* ANTLR 3 License
* [The "BSD licence"]
* Copyright (c) 2005-2008 Terence Parr
* 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.
******************************************************************************/
parser grammar EplParserRules;
options {backtrack=true; output=AST;}
tokens {
PATTERN;
CARDINALITY;
DOMAIN;
ROLE;
MATCH;
NOMATCH;
ONMATCH;
DO;
ALIAS;
NO;
OPTIONAL;
ACTIVE;
}
@members {
public void setTokenType(ParserRuleReturnScope tree, int type) {
((CommonTree) tree.getTree()).getToken().setType(type);
}
}
pattern
@after {
$tree.getExtraTokens().add($pt);
$tree.getExtraTokens().add($ob);
$tree.getExtraTokens().add($cb);
}
:
pt='pattern'^ NAME role (','! role)* (ob='{'! (match | do_ | nomatch | onmatch)* cb='}'!)?
{$pt.setType(PATTERN);}
;
role
: no? NAME (','! NAME)* n=':'^ t=typeName {setTokenType(t, TYPE);} cardinality? (domain | guard | optional | active)*
{$n.setType(ROLE);}
;
no : n='no' {$n.setType(NO);};
cardinality
@after {
$tree.getExtraTokens().add($cb);
}
: c='['^ bound ('..'! bound)? cb=']'!
{$c.setType(CARDINALITY);}
;
bound
: INT | '*'
;
domain :
(c='in'^|c='from'^) expressionOrStatementBlock
{$c.setType(DOMAIN);}
;
match :
c='match'^ expressionOrStatementBlock
{$c.setType(MATCH);}
;
optional :
c='optional'^ expressionOrStatementBlock
{$c.setType(OPTIONAL);}
;
active :
c='active'^ expressionOrStatementBlock
{$c.setType(ACTIVE);}
;
do_ :
c='do'^ expressionOrStatementBlock
{$c.setType(DO);}
;
onmatch :
c='onmatch'^ expressionOrStatementBlock
{$c.setType(ONMATCH);}
;
nomatch :
c='nomatch'^ expressionOrStatementBlock
{$c.setType(NOMATCH);}
;