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

Introduce ANTLR grammar for ModelJoin to start replacing custom parser

parent c4985e9c
No related branches found
No related tags found
1 merge request!4Include ModelJoin support in main development
......@@ -177,3 +177,7 @@ local.properties
output/
doc/
[lL]ocal[tT]est*
# ANTLR
gen/
import com.simplytyped.Antlr4Plugin.autoImport.antlr4PackageName
import sbt.Keys.{libraryDependencies, scalacOptions, version}
val emfcommonVersion = "2.12.0"
......@@ -40,5 +41,10 @@ lazy val generator = (project in file("."))
case x =>
val oldStrategy = (assemblyMergeStrategy in assembly).value
oldStrategy(x)
}
).dependsOn(syncProvider, rsumProvider)
},
).dependsOn(
syncProvider,
rsumProvider
).enablePlugins(Antlr4Plugin)
antlr4PackageName in Antlr4 := Some("org.rosi_project.model_sync.model_join.representation.parser.antlr.generated")
addSbtPlugin("com.simplytyped" % "sbt-antlr4" % "0.8.2")
/*
* ModelJoin.g4
*
* Defines the structure of our ModelJoin grammar
*
* Author: Rico Bergmann
*/
grammar ModelJoin;
/*
* Parser
*/
modeljoin : join+ EOF;
join : (naturaljoin | thetajoin | outerjoin) 'as' CLASSRES
( '{'
keepattributes*
keepaggregate*
keepexpressions*
'}' )? ;
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' ;
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 ;
/*
* Lexer
*/
fragment LOWERCASE : [a-z] ;
fragment UPPERCASE : [A-Z] ;
fragment ANYCASE : LOWERCASE | UPPERCASE ;
fragment DIGIT : [0-9] ;
fragment EELEMENTID : ANYCASE | (ANYCASE | '_')+(ANYCASE | DIGIT | '_')+ ;
CLASSRES : EELEMENTID ( '.' EELEMENTID )* ;
RELATTRRES : EELEMENTID ;
ATTRRES : CLASSRES '.' RELATTRRES ;
OCLCOND : .+? ;
SUMAGGR : 'sum' ;
AVGAGGR : 'avg' ;
MINAGGR : 'min' ;
MAXAGGR : 'max' ;
SIZEAGGR : 'size' ;
WHITESPACE : ' ' -> 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