source: proto/pabloj/branches/refactor-experimental/input/grammar/scatter/pabloS.scatter @ 3192

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

Sweeping changes to sync branch with trunk.

File size: 4.5 KB
Line 
1//
2// Tom Shermer, Ken Herdy
3//
4// PabloS - Parallel Stream Language 
5//
6// A tiny language for the definition of stream structures and stream functions.
7//
8// Modified:            2012/09/08 Original definition.
9//                                             
10
11types {
12        toolchain.pabloS.lang.type.Type,
13        toolchain.pabloS.lang.type.PrimitiveType,
14        toolchain.pabloS.lang.type.StreamType,
15}
16
17context main {
18
19  recognizers {
20         Whitespace [IGNORE],
21         Integer [INTEGER_CONST],
22         Identifier [IDENTIFIER],                       // Java identifiers, except $ character. Produces Lextant tokens for keywords.
23         Comment [IGNORE] "#" "\n",                     // Support parabix2_pablo debugging.
24         Comment [IGNORE] "//" "\n",     
25         Comment [SQ_STRING] "'" "'",
26         Comment [IGNORE] "/*" "*/",            // Comment. Comment [STRING] "/*" "*/",
27         String [STRING],
28         Punctuator,
29         EndOfInput,
30  }
31
32  // t o k e n s
33  tokens {
34        FUNCTION,       
35        STREAM,
36        STRUCT,
37        VOID,
38        INT,
39        IF,
40        ELSE,
41        WHILE,
42        RETURN,
43        AND             "&",
44        OR              "|",
45        NOT             "~",
46        XOR             "^",
47        MULTIPLY        "*",
48        DIVIDE          "/",
49        ADD                     "+",
50        SUBTRACT        "-",
51        ASSIGN      "=",
52        AND_ASSIGN  "&=",
53        OR_ASSIGN   "|=",
54        XOR_ASSIGN  "^=",
55        MULTIPLY_ASSIGN         "*=",
56        DIVIDE_ASSIGN           "/=",
57        ADD_ASSIGN                      "+=",
58        SUBTRACT_ASSIGN         "-=",
59        LANGLE          "<",
60        RANGLE          ">",
61        LCURLY          "{",
62        RCURLY          "}",
63        LROUND          "(",
64        RROUND          ")",
65        COMMA           ",",
66        TERMINATOR  ";",
67        DOT                     ".",
68  }
69}
70
71interfaces {
72//       escapable {boolean escaped = false;},
73         intValued {int value = 0;},
74}
75
76nodes {
77  ASTNode {Type type = null;} [assignOperator],
78  binaryOperator {} [expr expr1 expr3 expr4],
79  unaryOperator {} [expr2],     
80  assign {} [assignRest],
81  funcCall {} [funcCallRest],
82  integerConstant{intValued;} [fieldWidthSpecifier],
83  // primitiveType{} [intType voidType], // TODO - update S2B to handle this
84  streamType{int fieldWidth = 1;} [],
85}
86
87grammar {
88
89        program         -> (structDecl | funcDef) *;                   
90
91        //
92        // s t r e a m   s t r u c t   d e c l a r a t i o n s 
93        //
94        structDecl                      ->  STRUCT structName structDeclBody TERMINATOR? ;
95        structDeclBody          ->      LCURLY (structMember TERMINATOR)+ RCURLY ;
96        structMember            ->      structMemberType structMemberName ;
97        structMemberType        #-> structType | streamType ;
98        structMemberName        #-> identifier ;
99   
100    //
101        // s t r e a m   f u n c t i o n   d e c l a r a t i o n s                                                     
102        //
103        funcDef                 -> FUNCTION returnType funcName LROUND parameterList? RROUND blockStmt TERMINATOR? ;                           
104        returnType              #-> type ;     
105        parameterList   -> parameter (COMMA parameter)*;
106        funcName                #-> identifier ;
107        parameter               -> type parameterName ;
108        parameterName   #-> identifier ;
109               
110        //
111        // s t a t e m e n t s
112        //
113        stmt                                    #->     localVarDecl | funcCallOrAssignStmt | ifStmt | whileStmt | returnStmt  ;
114        blockStmt                               ->      LCURLY stmt* RCURLY ;
115        localVarDecl                    ->      type varName (ASSIGN^ expr) ? TERMINATOR ;
116        varName                                 #-> compoundIdentifier ;
117        funcCallOrAssignStmt    #-> expr (assignRest _promote_) ? TERMINATOR ; // add SA to validate expr is a function call
118        assignRest                              ->      assignOperator^! expr ;
119        assignOperator                  ->      ASSIGN | AND_ASSIGN | OR_ASSIGN | XOR_ASSIGN |
120                                                                MULTIPLY_ASSIGN | DIVIDE_ASSIGN | ADD_ASSIGN | SUBTRACT_ASSIGN ;               
121        ifStmt                                  ->  IF LROUND expr RROUND blockStmt (ELSE blockStmt)? ;                                                 
122        whileStmt                               ->      WHILE LROUND expr RROUND blockStmt ;
123        returnStmt                              ->      RETURN (expr)? TERMINATOR ;
124
125        //
126        // e x p r e s s i o n s
127        //     
128        expr    #->     expr1 ((OR^|XOR^) expr)? _leftAssoc_ ;
129        expr1   #-> expr2 ((AND^) expr1)? _leftAssoc_ ;
130        expr2   #-> NOT^^? expr3;
131        expr3   #-> expr4 ((MULTIPLY^ | DIVIDE^) expr3)? _leftAssoc_ ;
132        expr4   #-> expr5 ((ADD^ | SUBTRACT^) expr4)? _leftAssoc_ ;
133        expr5   #-> LROUND expr RROUND
134                                        | constant
135                                        | compoundIdentifier (funcCallRest _promote_) ?
136                                        ;
137                                                                                                                                                                                                                                                                       
138        constant                                #-> stringConstant | integerConstant ;
139        integerConstant                 ->      INTEGER_CONST {@value = @@value;} ;
140        stringConstant                  ->      STRING | SQ_STRING ;   
141        compoundIdentifier              #-> identifier (DOT^ identifier)*;
142        identifier                              ->      IDENTIFIER ;
143    funcCallRest                        ->      LROUND^ funcCallArgList RROUND ;
144        funcCallArgList                 ->      (expr (COMMA expr)*) ? ;       
145               
146    //   
147        // t y p e s
148        //
149        type                            #->     primitiveType   |
150                                                                streamType              |
151                                                                structType              ;
152
153        primitiveType           #->     ( intType | voidType ) ;
154        intType                         ->              INT    { @type = {{PrimitiveType.INTEGER}};  } ;
155        voidType                        ->              VOID   { @type = {{PrimitiveType.VOID}}; } ;
156
157        streamType                      ->              STREAM fieldWidthSpecifier! {   @fieldWidth = @:value;
158                                                                                                                                @type = {{ new StreamType(%?) }} , @fieldWidth ;
159                                                                                                                } ;
160                                       
161        fieldWidthSpecifier     #->     (LANGLE integerConstant RANGLE ) | (epsilon {@value = 1;}) ;   
162        structType                      ->              STRUCT structName ;             
163        structName                      #->     identifier ;                           
164
165}
Note: See TracBrowser for help on using the repository browser.