Skip to content
Snippets Groups Projects
Verified Commit c8e98ac6 authored by Rico Bergmann's avatar Rico Bergmann
Browse files

Complete and fix ModelJoin ANTLR grammar

parent d2edca90
No related branches found
No related tags found
1 merge request!4Include ModelJoin support in main development
...@@ -10,36 +10,49 @@ grammar ModelJoin; ...@@ -10,36 +10,49 @@ grammar ModelJoin;
/* /*
* Parser * Parser
*/ */
modeljoin : join+ EOF ; modeljoin : join+ EOF ;
join : (naturaljoin | thetajoin | outerjoin) 'as' CLASSRES join : (naturaljoin | thetajoin | outerjoin) AS classres
( '{' ( OPENCURLYBRAKET
keepattributes* keepattributesexpr*
keepaggregate* keepaggregatesexpr*
keepexpressions* keepexpr*
'}' )? ; CLOSEDCURLYBRAKET )? ;
naturaljoin : NATURAL JOIN classres WITH classres ;
naturaljoin : 'natural' 'join' CLASSRES 'with' CLASSRES ; thetajoin : THETA JOIN classres WITH classres WHERE oclcond;
thetajoin : 'theta' 'join' CLASSRES 'with' CLASSRES 'where' OCLCOND ; outerjoin : (leftouterjoin | rightouterjoin) OUTER JOIN WITH classres;
outerjoin : (leftouterjoin | rightouterjoin) 'outer' 'join' CLASSRES 'with' CLASSRES ; leftouterjoin : LEFT ;
leftouterjoin : 'left' ; rightouterjoin : RIGHT ;
rightouterjoin : 'right' ;
keepattributes : 'keep' 'attributes' ATTRRES ( ',' ATTRRES )* ; keepattributesexpr : KEEP ATTRIBUTES attrres (COMMA attrres)* ;
keepaggregate : 'keep' 'aggregate' aggrtype '(' RELATTRRES ')' 'over' ATTRRES 'as' CLASSRES ; keepaggregatesexpr : KEEP AGGREGATE aggrtype
keepexpressions : (keeptypeexpr | keepoutgoingexpr | keepincomingexpr) OPENBRAKET relattr CLOSEDBRAKET
( '{' OVER classres AS attrres;
keepattributes* keepexpr : (keeptypeexpr | keepoutgoingexpr | keepincomingexpr)
keepaggregate* ( OPENCURLYBRAKET
keepexpressions* keepattributesexpr*
'}' )? ; keepaggregatesexpr*
keepexpr*
CLOSEDCURLYBRAKET)? ;
keeptypeexpr : keepsupertypeexpr | keepsubtypeexpr ; keeptypeexpr : keepsupertypeexpr | keepsubtypeexpr ;
keepsupertypeexpr : 'keep' 'supertype' CLASSRES ( 'as' 'type' CLASSRES )? ; keepsupertypeexpr : KEEP SUPERTYPE ( AS TYPE classres )? ;
keepsubtypeexpr : 'keep' 'subtype' CLASSRES ( 'as' 'type' CLASSRES )? ; keepsubtypeexpr : KEEP SUBTYPE ( AS TYPE classres )? ;
keepoutgoingexpr : 'keep' 'outgoing' ATTRRES ( 'as' 'type' CLASSRES )? ; keepoutgoingexpr : KEEP OUTGOING attrres ( AS TYPE classres )? ;
keepincomingexpr : 'keep' 'incoming' ATTRRES ( 'as' 'type' CLASSRES )? ; keepincomingexpr : KEEP INCOMING attrres (AS TYPE classres )? ;
classres : WORD (DOT WORD)* ;
attrres : WORD (DOT WORD)+ ;
relattr : WORD ;
oclcond : (WORD | NUMBER | specialchar | WHITESPACE | NEWLINE)+;
aggrtype : SUM | AVG | MIN | MAX | SIZE ;
aggrtype : SUMAGGR | AVGAGGR | MINAGGR | MAXAGGR | SIZEAGGR ; specialchar : DOT
| OPENBRAKET
| CLOSEDBRAKET
| OPENCURLYBRAKET
| CLOSEDCURLYBRAKET
| COMMA
| UNDERSCORE
| SPECIALCHAR ;
/* /*
* Lexer * Lexer
...@@ -50,18 +63,43 @@ fragment UPPERCASE : [A-Z] ; ...@@ -50,18 +63,43 @@ fragment UPPERCASE : [A-Z] ;
fragment ANYCASE : LOWERCASE | UPPERCASE ; fragment ANYCASE : LOWERCASE | UPPERCASE ;
fragment DIGIT : [0-9] ; fragment DIGIT : [0-9] ;
fragment EELEMENTID : ANYCASE | (ANYCASE | '_')+(ANYCASE | DIGIT | '_')+ ; OPENBRAKET : '(' ;
CLOSEDBRAKET : ')' ;
OPENCURLYBRAKET : '{' ;
CLOSEDCURLYBRAKET : '}' ;
DOT : '.' ;
COMMA : ',' ;
UNDERSCORE : '_' ;
SPECIALCHAR : [-><!="'] ;
JOIN : 'join' ;
NATURAL : 'natural' ;
THETA : 'theta' ;
WHERE : 'where' ;
OUTER : 'outer' ;
RIGHT : 'right' ;
LEFT : 'left' ;
WITH : 'with' ;
AS : 'as' ;
KEEP : 'keep' ;
ATTRIBUTES : 'attributes' ;
AGGREGATE : 'aggregate' ;
SUPERTYPE : 'supertype' ;
SUBTYPE : 'subtype' ;
OUTGOING : 'outgoing' ;
INCOMING : 'incoming' ;
TYPE : 'type' ;
OVER : 'over' ;
CLASSRES : EELEMENTID ( '.' EELEMENTID )* ; SUM : 'sum' ;
RELATTRRES : EELEMENTID ; AVG : 'avg' ;
ATTRRES : CLASSRES '.' RELATTRRES ; MIN : 'min' ;
OCLCOND : .+? ; MAX : 'max' ;
SIZE : 'size' ;
SUMAGGR : 'sum' ; WORD : ANYCASE (ANYCASE | DIGIT | UNDERSCORE)* ;
AVGAGGR : 'avg' ; NUMBER : [+-]? DIGIT+ DOT? DIGIT* ;
MINAGGR : 'min' ;
MAXAGGR : 'max' ;
SIZEAGGR : 'size' ;
WHITESPACE : ' ' -> skip ; WHITESPACE : ' ' -> skip ;
NEWLINE : ('\r'? '\n' | '\r')+ -> skip ; NEWLINE : ('\r'? '\n' | '\r')+ -> skip ;
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment