tokens { PLUS = '+'; MINUS = '-'; MULT = '*'; DIV = '/'; EXP = '^'; EQ = '='; GE = '>='; LE = '<='; L = '<'; G = '>'; NEQ = '!='; TRUET = 'true'; FALSET = 'false'; CONNECTION = 'CON'; IMPORTFILE = 'IMPORT'; MEASURE = 'MEASURE'; AS = 'AS'; PREDICTOR = 'PREDICTOR'; DECISION = 'DECISION'; EXTENDS = 'EXTENDS'; ALTERNATIVE = 'ALT'; GOAL = 'GOAL'; WEIGHT = 'WEIGHT'; PARETO = 'PARETO'; MIN = 'MIN!'; MAX = 'MAX!'; SAT = 'SAT!'; FIX = 'FIX!'; QUOTE = '"'; COMMENTID = '#'; FUNOPEN = '('; FUNCLOSE = ')'; ARRAYOPEN = '['; ARRAYCLOSE = ']'; COMMA = ','; DOT = '.'; PERCENT = '%'; COLON = ':'; COMBINATORMEDIAN= '?'; COMBINATORBEST = '!'; } prog: head body; head : NEWLINE? ( connection | measure | importFile | assignmentCommand )* ; connection : CONNECTION name AS name NEWLINE ; measure : MEASURE name ARRAYOPEN (measureItem)? (COMMA measureItem)* ARRAYCLOSE NEWLINE ; measureItem : quotedString COLON expr ; importFile : IMPORTFILE name ; body : decision+ ; decision : (name)? name (EXTENDS name)? NEWLINE? decisionBody ; decisionBody : '{' NEWLINE? assignmentCommand* (goalAttribute|alternative)* '}' NEWLINE? ; alternative : ALTERNATIVE quotedString ( ( actions ) | ( name (INT )? ) | ( 'IMPORT' name ) ) NEWLINE? ; actions : ARRAYOPEN (action)? (COMMA action)* ARRAYCLOSE ; action : ( name (nam |quotedString)* ) | assignment | ( qualifiedDecisionName (INT)? ) | ( L ID (INT)? ) | ( '(' action ')' ) ; goalAttribute : GOAL ( quotedString )? ( ( goalFormular ( WEIGHT expr)? NEWLINE ) | ( constraint NEWLINE ) ) ; constraint : expr comparator expr ; comparator : EQ | NEQ | L | LE | G | GE ; goalFormular : ( ( (MIN FUNOPEN expr FUNCLOSE) | (MAX FUNOPEN expr FUNCLOSE) ) | ( (SAT FUNOPEN expr COMMA expr FUNCLOSE) | (FIX FUNOPEN expr COMMA expr FUNCLOSE) ) ) ; assignmentCommand : assignment NEWLINE ; assignment : name '=' expr ; quotedString : ANY ; qualifiedDecisionName : DECISIONID ; name : ID ; stat : mathstat | range ; range : ARRAYOPEN atom ('..' | '-') atom ARRAYCLOSE ; mref : ID FUNOPEN quotedString FUNCLOSE ; mathstat : expr (NEWLINE | EOF) ; expr : term ( ( PLUS expr ) | ( MINUS expr ) )? ; term : atom ( MULT atom )? ; atom : ( INT | FLOAT | MINUS a=atom | probDist | ID | function | '(' expr ')' | mref | TRUET | FALSET ) ( PERCENT )? ; function : name FUNOPEN ( atom ( COMMA atom )* )? FUNCLOSE ; probDist : ARRAYOPEN probDistEntry (COMMA probDistEntry)* ARRAYCLOSE ; probDistEntry : INT PERCENT COLON INT ; COMBINATOR : COMBINATORMEDIAN | COMBINATORBEST; DECISIONID : COMBINATOR ID; ID : ('a'..'z'|'A'..'Z'|'/'| UML) ('a'..'z'|'A'..'Z'|INT |'.'|'_'|'/'|UML)* ; INT : '0'..'9'+ ; FLOAT : INT ( DOT '0'..'9'+)?; NEWLINE : (COMMENT | '\r' | '\n')+ ; COMMENT : COMMENTID (~('\n'|'\r'))*; WS : ( '\t' | ' ' | '\r' | '\n'| '\u000C' )+; ANY : QUOTE (~('\n'|'\r' | QUOTE))* QUOTE;