diff --git a/src/main/antlr4/ModelJoin.g4 b/src/main/antlr4/ModelJoin.g4 index 3446a6d0696db9e948e660bfdbb756a80baf234d..864a32f4549d7fa6dcd213c9755b3077f931e1ba 100644 --- a/src/main/antlr4/ModelJoin.g4 +++ b/src/main/antlr4/ModelJoin.g4 @@ -10,58 +10,96 @@ grammar ModelJoin; /* * 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; -join : (naturaljoin | thetajoin | outerjoin) 'as' CLASSRES - ( '{' - keepattributes* - keepaggregate* - keepexpressions* - '}' )? ; +keepattributesexpr : KEEP ATTRIBUTES attrres (COMMA attrres)* ; +keepaggregatesexpr : KEEP AGGREGATE aggrtype + OPENBRAKET relattr CLOSEDBRAKET + OVER classres AS attrres; +keepexpr : (keeptypeexpr | keepoutgoingexpr | keepincomingexpr) + ( 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 ; -thetajoin : 'theta' 'join' CLASSRES 'with' CLASSRES 'where' OCLCOND ; -outerjoin : (leftouterjoin | rightouterjoin) 'outer' 'join' CLASSRES 'with' CLASSRES ; -leftouterjoin : 'left' ; -rightouterjoin : 'right' ; +classres : WORD (DOT WORD)* ; +attrres : WORD (DOT WORD)+ ; +relattr : WORD ; +oclcond : (WORD | NUMBER | specialchar | WHITESPACE | NEWLINE)+; +aggrtype : SUM | AVG | MIN | MAX | SIZE ; -keepattributes : 'keep' 'attributes' ATTRRES ( ',' ATTRRES )* ; -keepaggregate : 'keep' 'aggregate' aggrtype '(' RELATTRRES ')' 'over' ATTRRES 'as' CLASSRES ; -keepexpressions : (keeptypeexpr | keepoutgoingexpr | keepincomingexpr) - ( '{' - keepattributes* - keepaggregate* - keepexpressions* - '}' )? ; -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 ; +specialchar : DOT + | OPENBRAKET + | CLOSEDBRAKET + | OPENCURLYBRAKET + | CLOSEDCURLYBRAKET + | COMMA + | UNDERSCORE + | SPECIALCHAR ; /* * Lexer */ -fragment LOWERCASE : [a-z] ; -fragment UPPERCASE : [A-Z] ; -fragment ANYCASE : LOWERCASE | UPPERCASE ; -fragment DIGIT : [0-9] ; +fragment LOWERCASE : [a-z] ; +fragment UPPERCASE : [A-Z] ; +fragment ANYCASE : LOWERCASE | UPPERCASE ; +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 )* ; -RELATTRRES : EELEMENTID ; -ATTRRES : CLASSRES '.' RELATTRRES ; -OCLCOND : .+? ; +SUM : 'sum' ; +AVG : 'avg' ; +MIN : 'min' ; +MAX : 'max' ; +SIZE : 'size' ; -SUMAGGR : 'sum' ; -AVGAGGR : 'avg' ; -MINAGGR : 'min' ; -MAXAGGR : 'max' ; -SIZEAGGR : 'size' ; +WORD : ANYCASE (ANYCASE | DIGIT | UNDERSCORE)* ; +NUMBER : [+-]? DIGIT+ DOT? DIGIT* ; -WHITESPACE : ' ' -> skip ; -NEWLINE : ('\r'? '\n' | '\r')+ -> skip ; +WHITESPACE : ' ' -> skip ; +NEWLINE : ('\r'? '\n' | '\r')+ -> skip ;