source: proto/pabloj/trunk/input/grammar/scatter/pabloS.scatter @ 3254

Last change on this file since 3254 was 3254, checked in by shermer, 6 years ago

beginning to implement typechecking.

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