ScriptLanguage.g4 4.15 KB
Newer Older
1 2 3
grammar ScriptLanguage;

start
Alexander Weigl's avatar
Alexander Weigl committed
4
    :   (SCRIPT name=ID '(' signature=argList? ')' INDENT body=stmtList DEDENT)*
5 6 7
    ;

argList
Alexander Weigl's avatar
Alexander Weigl committed
8
    :   varDecl (',' varDecl)*
9 10 11
    ;

varDecl
Alexander Weigl's avatar
Alexander Weigl committed
12
    :   name=ID ':' type=ID
13 14 15
    ;

stmtList
Alexander Weigl's avatar
Alexander Weigl committed
16
    :   statement*
17 18 19 20 21 22 23 24 25
    ;

statement
    :   assignment
    |   repeatStmt
    |   casesStmt
    |   forEachStmt
    |   theOnlyStmt
    |   scriptCommand
Alexander Weigl's avatar
Alexander Weigl committed
26
  //  |   callStmt
27 28 29
    ;

assignment
Alexander Weigl's avatar
Alexander Weigl committed
30
    :   variable=ID (COLON type=ID)? ASSIGN expression SEMICOLON
31 32 33
    ;

expression
Alexander Weigl's avatar
Alexander Weigl committed
34
    :
Alexander Weigl's avatar
Alexander Weigl committed
35 36
        MINUS expression   #exprNegate
    |   NOT expression  #exprNot
Alexander Weigl's avatar
Alexander Weigl committed
37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
    |   expression MUL expression #exprMultiplication
    |   <assoc=right> expression DIV expression #exprDivision
    |   expression op=(PLUS|MINUS) expression #exprLineOperators
    |   expression op=(LE|GE|LEQ|GEQ) expression #exprComparison
    |   expression op=(NEQ|EQ) expression  #exprEquality
    |   expression AND expression   #exprAnd
    |   expression OR expression    #exprOr
    |   expression IMP expression   #exprIMP
    //|   expression EQUIV expression already covered by EQ/NEQ
    |   '(' expression ')' #exprParen
    | literals             #exprLiterals
    | matchPattern         #exprMatch
;

literals :
        ID             #literalID
    |   DIGITS         #literalDigits
    |   TERM_LITERAL   #literalTerm
    |   STRING_LITERAL #literalString
    |   TRUE           #literalTrue
    |   FALSE          #literalFalse
;

/**
 * Example: <pre>
    match `f(x) ==>` using [x:term]

     </pre>*/
65
matchPattern
Alexander Weigl's avatar
Alexander Weigl committed
66 67
    :   MATCH ( TERM_LITERAL | ID)
        (USING LBRACKET argList RBRACKET)?
68 69 70 71 72 73 74 75 76 77 78
    ;

scriptVar
    :   '?' ID
    ;

repeatStmt
    :   REPEAT INDENT stmtList DEDENT
    ;

casesStmt
Alexander Weigl's avatar
Alexander Weigl committed
79 80 81 82 83 84
    :   CASES INDENT
            casesList*
        (DEFAULT  COLON? INDENT
            defList=stmtList
          DEDENT)?
        DEDENT
85 86 87
    ;

casesList
Alexander Weigl's avatar
Alexander Weigl committed
88
    :   CASE expression COLON? INDENT stmtList DEDENT
89 90 91 92 93 94 95 96 97 98 99
    ;

forEachStmt
    :   FOREACH INDENT stmtList DEDENT
    ;

theOnlyStmt
    :   THEONLY INDENT stmtList DEDENT
    ;

scriptCommand
Alexander Weigl's avatar
Alexander Weigl committed
100
    :   cmd=ID parameters? SEMICOLON
101 102
    ;

Alexander Weigl's avatar
Alexander Weigl committed
103 104
parameters: parameter+;
parameter :  ((pname=ID '=')? expr=expression);
Alexander Weigl's avatar
Alexander Weigl committed
105

Alexander Weigl's avatar
Alexander Weigl committed
106
/*
107 108 109
callStmt
    :   CALL scriptCommand SEMICOLON
    ;
Alexander Weigl's avatar
Alexander Weigl committed
110
*/
111 112 113

//LEXER Rules
WS : [ \t\n\r]+ -> skip ;
Alexander Weigl's avatar
Alexander Weigl committed
114 115 116 117 118 119 120 121
CASES: 'cases';
CASE: 'case';
DEFAULT: 'default';
ASSIGN : ':=';
LBRACKET: '[';
RBRACKET:']';
USING : 'using';
MATCH : 'match';
122 123 124 125 126
SCRIPT : 'script' ;
TRUE : 'true' ;
FALSE : 'false' ;
CALL : 'call' ;
REPEAT : 'repeat' ;
Alexander Weigl's avatar
Alexander Weigl committed
127
/*INT : 'int' ;
128
BOOL: 'bool' ;
Alexander Weigl's avatar
Alexander Weigl committed
129
TERMTYPE : 'term' ;*/
130 131 132 133 134 135 136 137 138
FOREACH : 'foreach' ;
THEONLY : 'theonly' ;
ID : [a-zA-Z] [_a-zA-Z0-9]* ;
DIGITS : DIGIT+ ;
fragment DIGIT : [0-9] ;
INDENT : '{' ;
DEDENT : '}' ;
SEMICOLON : ';' ;
COLON : ':' ;
Alexander Weigl's avatar
Alexander Weigl committed
139 140 141 142 143 144 145 146 147

STRING_LITERAL
   : '\'' ('\'\'' | ~ ('\''))* '\''
   ;

TERM_LITERAL
   : '`' ~('`')* '`'
   ;

148 149 150 151 152 153 154 155 156 157 158 159
PLUS : '+' ;
MINUS : '-' ;
MUL : '*' ;
DIV : '/' ;
EQ : '=' ;
NEQ : '!=' ;
GEQ : '>=' ;
LEQ : '<=' ;
GE : '>' ;
LE : '<' ;
AND : '&' ;
OR: '|' ;
160
IMP : '==>' ;
161
EQUIV : '<=>' ;
Alexander Weigl's avatar
Alexander Weigl committed
162
NOT: 'not';
163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222

//options {...}
//import ... ;

//tokens {...}
//channels {...} // lexer only
//@actionName {...}

/*
//Script ::= 'script' ID (ARGLIST)? NEWLINE INDENT Cmd DEDENT | Cmd

Cmd ::= //Cmd ';' Cmd |
        VarAssign |
        //'repeat' NEWLINE INDENT Cmd+ DEDENT |
        'cases' NEWLINE DEDENT Case+ ('default:' NEWLINE INDENT Cmd DEDENT)? DEDENT |
        'foreach' NEWLINE INDENT Cmd+ DEDENT |
        'theonly'NEWLINE INDENT cmd DEDENT |
       // Cmd 'on' (ShemaTerm | ShemaVar)+ ('with' (ShemaVar| ShemaTerm))? |
       'call' scriptCommand;

Case ::= 'case' BoolExpr ':' NEWLINE INDENT Cmd+ DEDENT

VarAssign ::= ID ':' TYPE  |
              ID ':=' (AExpr| BExpr | ///PosExpr) //PosExp evtl. das matchpattern für Sequents?

//MatchPattern ::= 'match' ('Seq'? ShemaSeq) |
//                ('matchLabel'| 'matchRule') RegExpr

//                'match' ( `~[`]` | '~[\']' | ID)
*/



/*arithExpr
    :   ID
    |   DIGITS
    |   arithExpr arithOp arithExpr
    ;

arithOp
    :   '+' | '-' | '*' | '/'
    ;

boolExpr
    :   TRUE
    |   FALSE
    |   matchPattern
    |   'not' boolExpr
    |   boolExpr boolOp boolExpr
    |   arithExpr relOp arithExpr
    ;

boolOp
    :   'and' | 'or'
    ;

relOp
    :   '<' | '<=' | '=' | '>' | '>='
    ;
*/