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

Last change on this file since 3778 was 3778, checked in by ksherdy, 4 years ago

Minors updates to b2k grammar.

File size: 6.6 KB
Line 
1//
2// b2k - A very high-level IR for the expression of block-by-block parallel bit stream processing.
3//
4// 02-12-2012      Original definition.
5// 29-03-2013      Added IDISA function call.
6// 06-04-2013      Updated to Scatter with types.
7//
8//
9//
10// Tom Shermer <shermer at sfu dot ca>
11// Ken Herdy <ksherdy at sfu dot ca>
12//
13
14
15types {
16//    toolchain.s2k.lang.type.Type,
17//    toolchain.s2k.lang.type.PrimitiveType,
18//    toolchain.s2k.lang.type.StreamType,
19}
20
21context main {
22    recognizers {
23        Whitespace [IGNORE],
24        Integer [INTEGER_CONST],
25        Identifier [IDENTIFIER],        // Java identifiers. Produces Lextant Tokens for keywords.
26        Comment [IGNORE] "#" "\n",      // parabix2_pablo debugging only.
27        Comment [IGNORE] "//" "\n",
28        Comment [SQ_STRING] "'" "'",
29        Comment [IGNORE] "/*" "*/",     // Comment. Comment [STRING] "/*" "*/",
30        String [STRING],
31        Punctuator,
32        EndOfInput,
33    }
34
35    // t o k e n s
36    tokens {
37        INIT,
38        KERNEL,
39        IN,
40        OUT,
41        INOUT,
42        FUNCTION,   
43        STRUCT,
44        INT,
45        VOID,
46        BOOL,
47        BITFIELD    "BitField",
48        BITBLOCK    "BitBlock",
49        //CODEBLOCK,
50        IF,
51        ELSE,
52        WHILE,
53        RETURN,
54        ASSIGN      "=",
55        LANGLE      "<",
56        RANGLE      ">",
57        LCURLY      "{",
58        RCURLY      "}",
59        LROUND      "(",
60        RROUND      ")",
61        LSQUARE     "[",
62        RSQUARE     "]",
63        COMMA       ",",
64        TERMINATOR  ";",
65        DOT         ".",
66    }
67}
68
69interfaces {
70    intValued {int value = 0;},
71}
72
73nodes {
74    assign {} [assignRest],
75    funcCall {} [funcCallRest],
76    idisaFuncCall {} [idisaFuncCallRest],
77    integerConstant{intValued;} [fieldWidthSpecifier ], // codeBlockWidthSpecifier ],
78    // primitiveType{} [intType voidType boolType bitBlockType], // TODO - update S2B to handle this
79    fieldWidthType{int fieldWidth = 1;} [],
80    // codeBlockWidth{int codeBlockWidth = 128;} [],
81}
82
83grammar {
84   
85    program     -> (structDef | kernelDef) * ;
86   
87    //
88    // s t r u c t   d e f i n i t i o n 
89    //
90    structDef           ->  STRUCT structName structDefBody TERMINATOR? ;
91    structDefBody       ->  LCURLY (structMember TERMINATOR)+ RCURLY ;
92    structMember        ->  structMemberType structMemberName ;
93    structMemberType    #-> bitBlockType ;
94    structMemberName    #-> identifier ;
95
96    //
97    // k e r n e l   d e f i n i t i o n
98    //
99    kernelDef           ->  KERNEL kernelName LCURLY kernelInitDef (kernelFuncDef)+ carryDeclare TERMINATOR RCURLY TERMINATOR? ; 
100    kernelName          #-> identifier ;
101
102    //
103    // k e r n e l   p r o p e r t i e s 
104    //
105    kernelInitDef       #-> INIT LCURLY kernelProperty* RCURLY TERMINATOR? ;
106    kernelProperty      ->  propertyName ASSIGN propertyValue TERMINATOR ;
107    propertyName        #-> identifier ;
108    propertyValue       ->  LSQUARE integerConstant (COMMA integerConstant)* RSQUARE ;
109
110    //
111    // k e r n e l   f u n c t i o n   d e f i n i t i o n
112    //
113    kernelFuncDef       ->  FUNCTION kernelFuncName LROUND kernelParameterList RROUND kernelFuncBody TERMINATOR? ;
114    kernelParameterList ->  (kernelParameter (COMMA kernelParameter)* )?;
115    kernelFuncName      #-> identifier ;
116    kernelParameter     ->  (kernelParameterMode)? type kernelParameterName ;
117    kernelParameterMode ->  (IN | OUT | INOUT) ;
118    kernelParameterName #-> identifier ;
119    kernelFuncBody      #-> blockStmt ;
120    carryDeclare                #-> expr; // KH: temp hack to append the CarryDeclare() macro
121
122    //
123    // c o d e   b l o c k     // (32,64,128,256,...)
124    //
125    // codeBlock        ->  CODEBLOCK codeBlockWidthSpecifier! 
126    //                      { @codeBlockWidth = @:value; }
127    //                      blockStmt (TERMINATOR)? ;
128    //               
129    // codeBlockWidthSpecifier  #-> (LANGLE integerConstant RANGLE ) | (epsilon {@value = 128;}) ;
130
131    //
132    // s t a t e m e n t s
133    //
134    stmt                    #-> varDecl | funcCallOrAssignStmt | ifStmt | whileStmt | returnStmt  ;
135    funcCallOrAssignStmt    #-> expr (assignRest _promote_) ? TERMINATOR ; // KH: TODO Add Semantic Analysis pass to validate expr non-terminal is of function call node type   
136    idisaFuncCallArgList    ->  (expr (COMMA expr)*) ? ;
137    assignOperator          ->  ASSIGN ;                 
138    assignRest              ->  assignOperator^! expr ;               
139    ifStmt                  ->  IF LROUND expr RROUND blockStmt (ELSE blockStmt)? ;             
140    whileStmt               ->  WHILE LROUND expr RROUND blockStmt ;
141    returnStmt              ->  RETURN (expr) ? TERMINATOR ;
142    varDecl                 ->  type varName TERMINATOR ;
143    varName                 #-> identifier ;
144    blockStmt               ->  LCURLY stmt* RCURLY ;
145
146    //
147    // e x p r e s s i o n s
148    //   
149    expr                #-> LROUND expr RROUND
150                         | constant
151                         | compoundIdentifier ((funcCallRest _promote_) | (idisaFuncCallRest _promote_)) ? ;
152
153    constant            #->     stringConstant | integerConstant ;
154    integerConstant     ->      INTEGER_CONST {@value = @@value;} ;
155    stringConstant      ->      STRING | SQ_STRING ;
156    compoundIdentifier  #->     identifier (DOT^ identifier)* ;
157    identifier          ->      IDENTIFIER ;
158    funcCallRest        ->      LROUND^ funcCallArgList RROUND ;
159    funcCallArgList     ->      (expr (COMMA expr)*) ? ;
160    idisaFuncCallRest   ->      LANGLE^ fieldWidth RANGLE LROUND idisaFuncCallArgList RROUND;
161    fieldWidth          ->      integerConstant ; // fieldWidthSpecifier
162
163    //
164    // t y p e s
165    //
166    type                #-> primitiveType   |
167                            bitFieldType    |
168                            structType ;
169
170    primitiveType       #->  ( intType | voidType | boolType | bitBlockType ) ;
171
172    intType             ->  INT ;       // { @type = {{PrimitiveType.INTEGER}}; } ;
173    voidType            ->  VOID ;      // { @type = {{PrimitiveType.VOID}}; } ;
174    boolType            ->  BOOL ;      // { @type = {{PrimitiveType.BOOL}}; } ;
175    bitBlockType        ->  BITBLOCK ;  // { @type = {{PrimitiveType.BITBLOCK}}; } ;
176   
177    bitFieldType        ->  BITFIELD  fieldWidthSpecifier!
178                                            {   @fieldWidth = @:value;
179                                            // @type = {{ new BitFieldType(%?) }} , @fieldWidth ;
180                                            } ;
181
182    fieldWidthSpecifier    #-> (LANGLE integerConstant RANGLE )
183                            | (epsilon {@value = 1;}) ;
184   
185    structType              ->  STRUCT structName ;
186    structName              #-> identifier ;
187   
188}
Note: See TracBrowser for help on using the repository browser.