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

Last change on this file since 3788 was 3788, checked in by ksherdy, 6 years ago

Added basic graph code generation.

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