source: proto/s2k/trunk/framework/input/grammar/scatter/s2k.scatter @ 4008

Last change on this file since 4008 was 4008, checked in by ksherdy, 5 years ago

Minor edits.

File size: 10.1 KB
RevLine 
[3699]1// s2k - A domain specific language for streaming text extraction and transformations.
2//
[3777]3// 2012/09/08    Original definition.       
[3840]4// 2014/03/29    Removed VOID type as a return type.     
[3777]5// 2014/04/01    Added streamGraph.
[3840]6// 2014/15/04    Added foreach loop.
7// 2014/17/04    Added for loop.
[2834]8//
[3777]9// Tom Shermer <shermer at sfu dot ca>
10// Ken Herdy <ksherdy at sfu dot ca>
11//
[3004]12
[3141]13types {
[3699]14    toolchain.s2k.lang.signatures.FunctionSignature,
15    toolchain.s2k.lang.type.Type,
16    toolchain.s2k.lang.type.PrimitiveType,
17    toolchain.s2k.lang.type.StreamType,
18    toolchain.s2k.semanticAnalyzer.Binding,
19    toolchain.s2k.semanticAnalyzer.SymbolTable,
[3141]20}
21
[2834]22context main {
[2933]23
[3699]24    recognizers {
25        Whitespace [IGNORE],
[3840]26        Integer    [INTEGER_CONST],
[3699]27        Identifier [IDENTIFIER],        // Java identifiers, except $ character. Produces Lextant tokens for keywords.
[4008]28        Comment    [IGNORE] "#" "\n",   // Support parabix2_pablo debugging.
[3840]29        Comment    [IGNORE] "//" "\n",
30        Comment    [SQ_STRING] "'" "'",
[4008]31        Comment    [IGNORE] "/*" "*/",  // Comment. Comment [STRING] "/*" "*/",
[3840]32        String     [STRING],
[3699]33        Punctuator,
34        EndOfInput,
35    }
[2834]36
37  // t o k e n s
[3699]38    tokens {
[3782]39        GRAPH,   
[3767]40        FILTER,
[3769]41        IN,
42        OUT,
43        INOUT,
[3699]44        STREAM,
45        STRUCT,
46        INT,
47        IF,
48        ELSE,
49        WHILE,
[4008]50        FOR,         
51        BY,       
[3805]52        FOREACH,
[3699]53        RETURN,
[3762]54        AND             "&",
55        OR              "|",
56        NOT             "~",
57        XOR             "^",
58        MULTIPLY        "*",
59        DIVIDE          "/",
[3782]60        PLUS            "+",
61        MINUS           "-",
[3762]62        ASSIGN          "=",
63        AND_ASSIGN      "&=",
64        OR_ASSIGN       "|=",
65        XOR_ASSIGN      "^=",
66        MULTIPLY_ASSIGN "*=",
67        DIVIDE_ASSIGN   "/=",
[3782]68        PLUS_ASSIGN     "+=",
69        MINUS_ASSIGN    "-=",
[3762]70        LANGLE          "<",
71        RANGLE          ">",
72        LCURLY          "{",
73        RCURLY          "}",
74        LROUND          "(",
75        RROUND          ")",
76        COMMA           ",",
77        TERMINATOR      ";",
78        DOT             ".",
[4008]79        DDOT            "..",     
[3699]80    }
[2834]81}
82
83interfaces {
[3699]84    intValued       {int value = 0;},
85    hasSymbolTable  {SymbolTable symbolTable = null;},
86    hasBinding      {Binding binding = null;},
87    hasFieldWidth   {int fieldWidth = 1;},
88    hasSignature    {FunctionSignature signature = null;},
[2834]89}
90
91nodes {
[3699]92    ASTNode                 {Type type = null;}  [assignOperator],
93    program                 {hasSymbolTable;} [],
[3777]94    structDef               {hasSymbolTable;} [],
[3769]95    filterDef               {hasSymbolTable;} [],
[3699]96    blockStmt               {hasSymbolTable;} [],
[3839]97    identifier              {hasBinding;}     [],
98    compoundIdentifier      {hasBinding;}     [],
[4008]99    unaryOperator           {hasSignature;}   [expr5],
100    binaryOperator          {hasSignature;}   [expr expr1 expr2 expr3 expr4],
[3839]101    assign                  {}                [assignRest],
102    funcCall                {hasSignature;}   [funcCallRest],
103    idisaFuncCall           {hasSignature;}   [idisaFuncCallRest],
104    streamType              {hasFieldWidth;}  [],
105    integerConstant         {intValued;}      [fieldWidthSpecifier],
[4008]106    step                    {intValued;}      [],
[3839]107//  primitiveType           {}                [intType voidType], // KH: update S2K2B2k for primitiveType
[3840]108                       
[2834]109}
110
111grammar {
[3192]112
[3788]113    program     -> ( structDef | filterDef ) * graphDef ? ;
[2834]114
[3699]115    //
[3782]116    // s t r e a m   s t r u c t   d e f i n i t i o n
[3699]117    //
[3840]118    structDef             ->  STRUCT identifier structDefBody TERMINATOR? ;
[3777]119    structDefBody         ->  LCURLY (structMember TERMINATOR)+ RCURLY ;
[3840]120    structMember          ->  structMemberType identifier ;
[3777]121    structMemberType      #-> streamType ;
[3681]122
[3769]123    // KH: user-defined stream functions?
[3699]124    //
[3782]125    // s t r e a m   f u n c t i o n   d e f i n i t i o n   
[3699]126    //
[3840]127    //funcDef             ->  FUNCTION funcReturnType identifier LROUND funcParameterList RROUND funcBody TERMINATOR? ;
[3782]128    //funcReturnType      #-> type;                     
129    //funcParameterList   ->  ( funcParameter (COMMA funcParameter)* ) ? ;
[3840]130    //funcParameter       ->  type identifier ;
[3681]131
[3699]132    //
[3782]133    // s t r e a m   f i l t e r   ( p r o c e d u r e )  d e f i n i t i o n
[3699]134    //
[3840]135    filterDef                   ->  FILTER identifier LROUND filterParameterList RROUND blockStmt TERMINATOR? ;               
[3782]136    filterParameterList         ->  ( filterParameter (COMMA filterParameter)* ) ? ;
[3840]137    filterParameter             ->  filterParameterMode? type identifier ;
[3782]138    filterParameterMode         ->  (IN | OUT | INOUT) ; // KH: not implemented
[3681]139
[3699]140    //
[3782]141    // s t r e a m   g r a p h  ( p i p e l i n e )  d e f i n i t i o n
142    //   
[3840]143    graphDef                    ->  GRAPH identifier LROUND graphParameterList RROUND graphBody TERMINATOR ? ;
[3782]144   
145    graphParameterList          ->  ( graphParameter (COMMA graphParameter)* ) ? ; // KH: implement as a 'modal' parameter
[3840]146    graphParameter              ->  graphParameterMode? type identifier ;
[3782]147    graphParameterMode          ->  (IN | OUT | INOUT) ;
148   
[3788]149    graphBody                   ->  LCURLY graphVarDecls addFilterStmts RCURLY ;
[3782]150   
[3788]151    graphVarDecls               ->  ( structDecl | filterDecl ) * ; 
[3840]152    structDecl                  ->  structType identifier TERMINATOR ;
153    filterDecl                  ->  filterType identifier TERMINATOR ;
[3782]154   
[3840]155    // graphDecl                ->  GRAPH identifier TERMINATOR ;
156   
[3788]157    addFilterStmts              ->  addFilterStmt * ;
[3840]158    addFilterStmt                   ->  identifier LROUND addFilterArgList RROUND TERMINATOR ;
159    addFilterArgList            ->  (identifier (COMMA identifier) *) ? ;
[3782]160
161    //
[3699]162    // s t a t e m e n t s
163    //
[3840]164    stmt                        #->     varDecl | funcCallOrAssignStmt | returnStmt | ifStmt | whileStmt | foreachStmt | forStmt ;
[3699]165    blockStmt                   ->      LCURLY stmt* RCURLY ;
[3840]166    varDecl                     ->      type identifier (ASSIGN^ expr) ? TERMINATOR ;
[3769]167    funcCallOrAssignStmt        #->     expr (assignRest _promote_) ? TERMINATOR ; // KH: SA must validate 'expr' is a 'funcCall'
[3699]168    assignRest                  ->      assignOperator^! expr ;
169    assignOperator              ->      ASSIGN | AND_ASSIGN | OR_ASSIGN | XOR_ASSIGN |
[3782]170                                        MULTIPLY_ASSIGN | DIVIDE_ASSIGN | PLUS_ASSIGN | MINUS_ASSIGN ;       
[3699]171    returnStmt                  ->      RETURN (expr)? TERMINATOR ;
[3840]172    ifStmt                      ->      IF expr blockStmt (ELSE blockStmt)? ;                         
173    whileStmt                   ->      WHILE expr blockStmt ;
[3699]174
[3840]175    // KH: eliminate stream<1> type ?
176    foreachStmt                 ->      FOREACH indexStreamDeclList IN targetStreamDeclList blockStmt ;
177    indexStreamDeclList         #->     streamDeclList ;
178    targetStreamDeclList        #->     streamDeclList ;
179        streamDeclList              ->      streamDecl ( COMMA streamDecl ) * ;
180        streamDecl                  ->      streamType identifier ;
[3834]181         
[4008]182        // KH: count controlled for loop to support reductions         
183        forStmt                     ->      FOR identifier IN stridedRange blockStmt ;
184        //indexTypeDecl             ->      indexType identifier ; // ?
185    stridedRange                ->      range step ;
186    range                       ->      integerConstant DDOT integerConstant ;
187    step                        #->     (BY integerConstant) | epsilon {@value = 1;} ;
[3805]188
[3840]189    //annotationStmt    -> AMPERSAND identifier LROUND annotationArgList RROUND blockStmt TERMINATOR ;
190    //annotationArgList -> (expr (COMMA expr)*) ?   
[3681]191
[3699]192    //
193    // e x p r e s s i o n s
194    //   
[4008]195   
196    // follows C++ operator precedence, DNE IN operator since list types DNE
[3681]197
[4008]198//    expr        #-> expr1 ((BY^) expr1)?                  _leftAssoc_ ;   
199//    expr1       #-> expr2 ((RANGE^) expr2)?               _leftAssoc_ ;
200    expr        #-> expr1 ((OR^) expr)?                   _leftAssoc_ ;
201    expr1       #-> expr2 ((XOR^) expr1)?                 _leftAssoc_ ;
202    expr2       #-> expr3 ((AND^) expr2)?                 _leftAssoc_ ;
203    expr3       #-> expr4 ((PLUS^ | MINUS^) expr3)?       _leftAssoc_ ;
204    expr4       #-> expr5 ((MULTIPLY^ | DIVIDE^) expr4)?  _leftAssoc_ ;
205    expr5       #-> ((PLUS^^ | MINUS^^)? expr6) | ((NOT^^)* expr6)                          ;
206    expr6       #-> compoundIdentifier ((funcCallRest _promote_) | (idisaFuncCallRest _promote_)) ? 
207                |   LROUND expr RROUND
208                |   constant ;
209
[3699]210    constant                #-> stringConstant | integerConstant ;
[3782]211    integerConstant         ->  INTEGER_CONST {@value = @@value;} ;
212    stringConstant          ->  STRING | SQ_STRING ;   
[3699]213    compoundIdentifier      #-> identifier (DOT^ identifier)?;
[3782]214    identifier              ->  IDENTIFIER ;
215    funcCallRest            ->  LROUND^ funcCallArgList RROUND ;
216    funcCallArgList         ->  (expr (COMMA expr)*) ? ;     
[3834]217    idisaFuncCallRest       ->  LANGLE^ fieldWidth RANGLE LROUND idisaFuncCallArgList RROUND ;
[3805]218    idisaFuncCallArgList    ->  (expr (COMMA expr)*) ? ;
[3834]219    fieldWidth              ->  integerConstant ;
[3681]220
[3699]221    //
222    // t y p e s
223    //
224    type                    #->     primitiveType   |
225                                    streamType      |
[3782]226                                    structType      |
227                                    filterType      ;
[3161]228
[3699]229    intType                 ->      INT    { @type = {{PrimitiveType.INTEGER}};  } ;
[3840]230    primitiveType           #->     intType ;
231    indexType               #->     intType ;
[3834]232   
[3699]233    streamType              ->      STREAM fieldWidthSpecifier! {   @fieldWidth = @:value;
234                                                                    @type = {{ StreamType.STREAM(%?) }} , @fieldWidth ;
235                                                                } ;
[3834]236    fieldWidthSpecifier     #->     (LANGLE integerConstant RANGLE ) | (epsilon {@value = 1;}) ;   
237    // fieldWidthSpecifier  #->     (LANGLE expr RANGLE ) | (epsilon {@value = 1;}) ;
238   
[3840]239    structType              ->      STRUCT identifier ;       
240    filterType              ->      FILTER identifier ;       
[2834]241}
Note: See TracBrowser for help on using the repository browser.