Skip to content
Snippets Groups Projects

Include ModelJoin support in main development

Merged Rico Bergmann requested to merge feature/modeljoin-support into develop
1 file
+ 81
43
Compare changes
  • Side-by-side
  • Inline
+ 81
43
@@ -10,58 +10,96 @@ grammar ModelJoin;
@@ -10,58 +10,96 @@ grammar ModelJoin;
/*
/*
* Parser
* Parser
*/
*/
 
modeljoin : join+ EOF ;
 
join : (naturaljoin | thetajoin | outerjoin) AS classres
 
( OPENCURLYBRAKET
 
keepattributesexpr*
 
keepaggregatesexpr*
 
keepexpr*
 
CLOSEDCURLYBRAKET )? ;
 
naturaljoin : NATURAL JOIN classres WITH classres ;
 
thetajoin : THETA JOIN classres WITH classres WHERE oclcond;
 
outerjoin : (leftouterjoin | rightouterjoin) OUTER JOIN WITH classres;
 
leftouterjoin : LEFT ;
 
rightouterjoin : RIGHT ;
modeljoin : join+ EOF;
keepattributesexpr : KEEP ATTRIBUTES attrres (COMMA attrres)* ;
join : (naturaljoin | thetajoin | outerjoin) 'as' CLASSRES
keepaggregatesexpr : KEEP AGGREGATE aggrtype
( '{'
OPENBRAKET relattr CLOSEDBRAKET
keepattributes*
OVER classres AS attrres;
keepaggregate*
keepexpr : (keeptypeexpr | keepoutgoingexpr | keepincomingexpr)
keepexpressions*
( OPENCURLYBRAKET
'}' )? ;
keepattributesexpr*
 
keepaggregatesexpr*
 
keepexpr*
 
CLOSEDCURLYBRAKET)? ;
 
keeptypeexpr : keepsupertypeexpr | keepsubtypeexpr ;
 
keepsupertypeexpr : KEEP SUPERTYPE ( AS TYPE classres )? ;
 
keepsubtypeexpr : KEEP SUBTYPE ( AS TYPE classres )? ;
 
keepoutgoingexpr : KEEP OUTGOING attrres ( AS TYPE classres )? ;
 
keepincomingexpr : KEEP INCOMING attrres (AS TYPE classres )? ;
naturaljoin : 'natural' 'join' CLASSRES 'with' CLASSRES ;
classres : WORD (DOT WORD)* ;
thetajoin : 'theta' 'join' CLASSRES 'with' CLASSRES 'where' OCLCOND ;
attrres : WORD (DOT WORD)+ ;
outerjoin : (leftouterjoin | rightouterjoin) 'outer' 'join' CLASSRES 'with' CLASSRES ;
relattr : WORD ;
leftouterjoin : 'left' ;
oclcond : (WORD | NUMBER | specialchar | WHITESPACE | NEWLINE)+;
rightouterjoin : 'right' ;
aggrtype : SUM | AVG | MIN | MAX | SIZE ;
keepattributes : 'keep' 'attributes' ATTRRES ( ',' ATTRRES )* ;
specialchar : DOT
keepaggregate : 'keep' 'aggregate' aggrtype '(' RELATTRRES ')' 'over' ATTRRES 'as' CLASSRES ;
| OPENBRAKET
keepexpressions : (keeptypeexpr | keepoutgoingexpr | keepincomingexpr)
| CLOSEDBRAKET
( '{'
| OPENCURLYBRAKET
keepattributes*
| CLOSEDCURLYBRAKET
keepaggregate*
| COMMA
keepexpressions*
| UNDERSCORE
'}' )? ;
| SPECIALCHAR ;
keeptypeexpr : keepsupertypeexpr | keepsubtypeexpr ;
keepsupertypeexpr : 'keep' 'supertype' CLASSRES ( 'as' 'type' CLASSRES )? ;
keepsubtypeexpr : 'keep' 'subtype' CLASSRES ( 'as' 'type' CLASSRES )? ;
keepoutgoingexpr : 'keep' 'outgoing' ATTRRES ( 'as' 'type' CLASSRES )? ;
keepincomingexpr : 'keep' 'incoming' ATTRRES ( 'as' 'type' CLASSRES )? ;
aggrtype : SUMAGGR | AVGAGGR | MINAGGR | MAXAGGR | SIZEAGGR ;
/*
/*
* Lexer
* Lexer
*/
*/
fragment LOWERCASE : [a-z] ;
fragment LOWERCASE : [a-z] ;
fragment UPPERCASE : [A-Z] ;
fragment UPPERCASE : [A-Z] ;
fragment ANYCASE : LOWERCASE | UPPERCASE ;
fragment ANYCASE : LOWERCASE | UPPERCASE ;
fragment DIGIT : [0-9] ;
fragment DIGIT : [0-9] ;
 
 
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' ;
fragment EELEMENTID : ANYCASE | (ANYCASE | '_')+(ANYCASE | DIGIT | '_')+ ;
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 ;
Loading