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

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

End-of-workday commit. More work towards semantic analyzer.

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