CSC448: Parsing: Clogs: Parser [11/26] Previous pageContentsNext page

file:clogs.cup [source]
00001: package clogs.parser;
00002: 
00003: import java_cup.runtime.*;
00004: import clogs.ast.*;
00005: import clogs.util.List;
00006: import clogs.util.Optional;
00007: 
00008: /* TO PRINT LIST OF TOKENS DURING READ, UNCOMMENT FOLLOWING LINE */
00009: /* scan with {: return ((ClogsLexer) getScanner ()).debug_next_token (); :}; */
00010: 
00011: terminal           IF, LOWER_THAN_ELSE, ELSE, WHILE, GOTO, RETURN, SKIP, NEW;
00012: terminal           VOID, INT;
00013: terminal           LBRACK, RBRACK, LBRACE, RBRACE, LPAREN, RPAREN;
00014: terminal           COMMA, SEMI, COLON, COLONCOLON, EQUALS, BANG, EQUALSEQUALS, BANGEQUALS;
00015: terminal           LESSTHAN, GREATERTHAN, LEQ, GEQ, BAR, CARET, AMP, BARBAR, AMPAMP;
00016: terminal           PLUS, MINUS, TIMES, DIVIDE, MOD;
00017: 
00018: terminal String    IDENTIFIER; 
00019: terminal Integer   INTEGER_CONSTANT;
00020: terminal Character CHARACTER_CONSTANT;
00021: terminal String    STRING_CONSTANT; 
00022: 
00023: non terminal List<ExtDecl>  translation_unit;
00024: non terminal ExtDecl        external_declaration;
00025: non terminal FunDef         function_definition;
00026: non terminal Decl           declaration;
00027: non terminal List<Decl>     declaration_list_opt;
00028: non terminal List<Decl>     declaration_list;
00029: non terminal Type           type_specifier;
00030: non terminal InitDecl       init_declarator;
00031: non terminal List<Decl>     parameter_type_list_opt;
00032: non terminal List<Decl>     parameter_type_list;
00033: non terminal Decl           parameter_declaration;
00034: non terminal Exp            initializer;
00035: non terminal Stat           statement;
00036: non terminal Stat           labeled_statement;
00037: non terminal Stat           expression_statement;
00038: non terminal StatCompound   compound_statement;
00039: non terminal List<Stat>     statement_list_opt;
00040: non terminal List<Stat>     statement_list;
00041: non terminal Stat           selection_statement;
00042: non terminal Stat           iteration_statement;
00043: non terminal Stat           jump_statement;
00044: non terminal Optional<Exp>  expression_opt;
00045: non terminal Exp            expression;
00046: non terminal Exp            assignment_expression;
00047: non terminal Exp            assignment_operator;
00048: non terminal Exp            conditional_expression;
00049: non terminal Exp            logical_or_expression;
00050: non terminal Exp            logical_and_expression;
00051: non terminal Exp            inclusive_or_expression;
00052: non terminal Exp            exclusive_or_expression;
00053: non terminal Exp            and_expression;
00054: non terminal Exp            equality_expression;
00055: non terminal Exp            relational_expression;
00056: non terminal Exp            shift_expression;
00057: non terminal Exp            additive_expression;
00058: non terminal Exp            multiplicative_expression;
00059: non terminal Exp            cast_expression;
00060: non terminal Exp            unary_expression;
00061: non terminal ExpUnOp.UnOp   unary_operator;
00062: non terminal Exp            postfix_expression;
00063: non terminal Exp            primary_expression;
00064: non terminal Optional<Type> type_assertion_opt;
00065: non terminal List<Exp>      argument_expression_list_opt;
00066: non terminal List<Exp>      argument_expression_list;
00067: non terminal Exp            constant;
00068: 
00069: precedence nonassoc LOWER_THAN_ELSE;
00070: precedence nonassoc ELSE; 
00071: 
00072: translation_unit
00073:  ::= external_declaration:ed
00074:      {: RESULT = List.singleton (ed); :}
00075:      | 
00076:      translation_unit:l external_declaration:ed
00077:      {: RESULT = l.snoc (ed); :}
00078:      ;
00079: 
00080: external_declaration
00081:  ::= function_definition:fd
00082:      {: RESULT = fd; :}
00083:      | 
00084:      declaration:d
00085:      {: RESULT = d; :}
00086:      ;
00087: 
00088: function_definition
00089:  ::= type_specifier:t IDENTIFIER:name LPAREN parameter_type_list_opt:l RPAREN compound_statement:s
00090:      {: RESULT = new FunDef (t, name, l, s); :}
00091:      ;
00092: 
00093: declaration
00094:  ::= type_specifier:t init_declarator:id SEMI 
00095:      {: RESULT = new Decl (t, id.name, id.eo); :}
00096:      ;
00097: 
00098: declaration_list_opt
00099:  ::= declaration_list:l
00100:      {: RESULT = l; :}
00101:      |
00102:      {: RESULT = List.nil (); :}
00103:      ;
00104: 
00105: declaration_list
00106:  ::= declaration:d
00107:      {: RESULT = List.singleton (d); :}
00108:      |
00109:      declaration_list:l declaration:d
00110:      {: RESULT = l.snoc (d); :}
00111:      ;
00112: 
00113: type_specifier
00114:  ::= VOID
00115:      {: RESULT = new TypeVoid (); :}
00116:      |
00117:      INT
00118:      {: RESULT = new TypeInt (); :}
00119:      |
00120:      type_specifier:t LBRACK RBRACK
00121:      {: RESULT = new TypeArray (t); :}
00122:      ;
00123: 
00124: init_declarator
00125:  ::= IDENTIFIER:name
00126:      {: RESULT = new InitDecl (name, new Optional<Exp> ()); :}
00127:      |
00128:      IDENTIFIER:name EQUALS initializer:e
00129:      {: RESULT = new InitDecl (name, new Optional<Exp> (e)); :}
00130:      ;
00131: 
00132: parameter_type_list_opt
00133:  ::= parameter_type_list:l
00134:      {: RESULT = l; :}
00135:      |
00136:      {: RESULT = List.nil (); :}
00137:      ;
00138: 
00139: parameter_type_list
00140:  ::= parameter_declaration:d
00141:      {: RESULT = List.singleton (d); :}
00142:      | 
00143:      parameter_type_list:l COMMA parameter_declaration:d
00144:      {: RESULT = l.snoc (d); :}
00145:      ;
00146: 
00147: parameter_declaration
00148:  ::= type_specifier:t IDENTIFIER:name
00149:      {: RESULT = new Decl (t, name, new Optional<Exp> ()); :}
00150:      ;
00151: 
00152: initializer
00153:  ::= assignment_expression:e
00154:      {: RESULT = e; :}
00155:      ;
00156: 
00157: statement
00158:  ::= labeled_statement:s
00159:      {: RESULT = s; :}
00160:      |
00161:      expression_statement:s
00162:      {: RESULT = s; :}
00163:      |
00164:      compound_statement:s
00165:      {: RESULT = s; :}
00166:      |
00167:      selection_statement:s
00168:      {: RESULT = s; :}
00169:      |
00170:      iteration_statement:s
00171:      {: RESULT = s; :}
00172:      |
00173:      jump_statement:s
00174:      {: RESULT = s; :}
00175:      ;
00176: 
00177: labeled_statement
00178:  ::= IDENTIFIER:label COLON statement:s
00179:      {: RESULT = s.addLabel (label); :}
00180:      ;
00181: 
00182: expression_statement
00183:  ::= expression_opt:eo SEMI
00184:      {: 
00185:         if (eo.isEmpty ()) {
00186:           RESULT = new StatSkip ();
00187:         } else {
00188:           RESULT = new StatExp (eo.get ());
00189:         }
00190:      :}
00191:      |
00192:      SKIP SEMI
00193:      {: RESULT = new StatSkip (); :}
00194:      ;
00195: 
00196: compound_statement
00197:  ::= LBRACE declaration_list_opt:ld statement_list_opt:ls RBRACE
00198:      {: RESULT = new StatCompound (ld, ls); :}
00199:      ;
00200: 
00201: statement_list_opt
00202:  ::= statement_list:l
00203:      {: RESULT = l; :}
00204:      |
00205:      {: RESULT = List.nil (); :}
00206:      ;
00207: 
00208: statement_list
00209:  ::= statement:s
00210:      {: RESULT = List.singleton (s); :}
00211:      |
00212:      statement_list:l statement:s
00213:      {: RESULT = l.snoc (s); :}
00214:      ;
00215: 
00216: selection_statement
00217:  ::= IF LPAREN expression:e RPAREN statement:sT 
00218:      {: RESULT = new StatIf (e, sT, new StatSkip ()); :}
00219:      %prec LOWER_THAN_ELSE
00220:      |
00221:      IF LPAREN expression:e RPAREN statement:sT ELSE statement:sF
00222:      {: RESULT = new StatIf (e, sT, sF); :}
00223:      ;
00224: 
00225: iteration_statement
00226:  ::= WHILE LPAREN expression:e RPAREN statement:s
00227:      {: RESULT = new StatWhile (e, s); :}
00228:      ;
00229: 
00230: jump_statement
00231:  ::= GOTO IDENTIFIER:target SEMI
00232:      {: RESULT = new StatGoto (target); :}
00233:      |
00234:      RETURN expression_opt:eo SEMI
00235:      {: RESULT = new StatReturn (eo); :}
00236:      ;
00237: 
00238: expression_opt
00239:  ::= expression:e
00240:      {: RESULT = new Optional<Exp> (e); :}
00241:      |
00242:      {: RESULT = new Optional<Exp> (); :}
00243:      ;
00244: 
00245: expression
00246:  ::= assignment_expression:e
00247:      {: RESULT = e; :}
00248:      |
00249:      expression:e1 COMMA assignment_expression:e2
00250:      {: RESULT = new ExpComma (e1, e2); :}
00251:      ;
00252: 
00253: assignment_expression
00254:  ::= conditional_expression:e
00255:      {: RESULT = e; :}
00256:      | 
00257:      unary_expression:e1 assignment_operator:op assignment_expression:e2
00258:      {: RESULT = new ExpAssign (e1, e2); :}
00259:      ;
00260: 
00261: assignment_operator
00262:  ::= EQUALS; 
00263: 
00264: conditional_expression
00265:  ::= logical_or_expression:e
00266:      {: RESULT = e; :}
00267:      ;
00268:      /* ignored cases */
00269: 
00270: logical_or_expression
00271:  ::= logical_and_expression:e
00272:      {: RESULT = e; :}
00273:      |
00274:      logical_or_expression:e1 BARBAR logical_and_expression:e2
00275:      {: RESULT = new ExpBinOp (ExpBinOp.BinOp.BARBAR, e1, e2); :}
00276:      ;
00277: 
00278: logical_and_expression
00279:  ::= inclusive_or_expression:e
00280:      {: RESULT = e; :}
00281:      |     
00282:      logical_and_expression:e1 AMPAMP inclusive_or_expression:e2
00283:      {: RESULT = new ExpBinOp (ExpBinOp.BinOp.AMPAMP, e1, e2); :}
00284:      ;
00285: 
00286: inclusive_or_expression
00287:  ::= exclusive_or_expression:e
00288:      {: RESULT = e; :}
00289:      |
00290:      inclusive_or_expression:e1 BAR exclusive_or_expression:e2
00291:      {: RESULT = new ExpBinOp (ExpBinOp.BinOp.BAR, e1, e2); :}
00292:      ;
00293: 
00294: exclusive_or_expression
00295:  ::= and_expression:e
00296:      {: RESULT = e; :}
00297:      |
00298:      exclusive_or_expression:e1 CARET and_expression:e2
00299:      {: RESULT = new ExpBinOp (ExpBinOp.BinOp.CARET, e1, e2); :}
00300:      ;
00301: 
00302: and_expression
00303:  ::= equality_expression:e
00304:      {: RESULT = e; :}
00305:      |
00306:      and_expression:e1 AMP equality_expression:e2
00307:      {: RESULT = new ExpBinOp (ExpBinOp.BinOp.AMP, e1, e2); :}
00308:      ;
00309: 
00310: equality_expression
00311:  ::= relational_expression:e
00312:      {: RESULT = e; :}
00313:      |
00314:      equality_expression:e1 EQUALSEQUALS relational_expression:e2
00315:      {: RESULT = new ExpBinOp (ExpBinOp.BinOp.EQUALSEQUALS, e1, e2); :}
00316:      |
00317:      equality_expression:e1 BANGEQUALS relational_expression:e2
00318:      {: RESULT = new ExpBinOp (ExpBinOp.BinOp.BANGEQUALS, e1, e2); :}
00319:      ;
00320: 
00321: relational_expression
00322:  ::= shift_expression:e
00323:      {: RESULT = e; :}
00324:      |
00325:      relational_expression:e1 LESSTHAN shift_expression:e2
00326:      {: RESULT = new ExpBinOp (ExpBinOp.BinOp.LESSTHAN, e1, e2); :}
00327:      |
00328:      relational_expression:e1 GREATERTHAN shift_expression:e2
00329:      {: RESULT = new ExpBinOp (ExpBinOp.BinOp.GREATERTHAN, e1, e2); :}
00330:      |
00331:      relational_expression:e1 LEQ shift_expression:e2
00332:      {: RESULT = new ExpBinOp (ExpBinOp.BinOp.LEQ, e1, e2); :}
00333:      |
00334:      relational_expression:e1 GEQ shift_expression:e2
00335:      {: RESULT = new ExpBinOp (ExpBinOp.BinOp.GEQ, e1, e2); :}
00336:      ;
00337: 
00338: shift_expression
00339:  ::= additive_expression:e
00340:      {: RESULT = e; :}
00341:      ;
00342:      /* ignored cases */
00343: 
00344: additive_expression
00345:  ::= multiplicative_expression:e
00346:      {: RESULT = e; :}
00347:      |
00348:      additive_expression:e1 PLUS multiplicative_expression:e2
00349:      {: RESULT = new ExpBinOp (ExpBinOp.BinOp.PLUS, e1, e2); :}
00350:      |
00351:      additive_expression:e1 MINUS multiplicative_expression:e2
00352:      {: RESULT = new ExpBinOp (ExpBinOp.BinOp.MINUS, e1, e2); :}
00353:      ;
00354: 
00355: multiplicative_expression
00356:  ::= cast_expression:e
00357:      {: RESULT = e; :}
00358:      |
00359:      multiplicative_expression:e1 TIMES cast_expression:e2
00360:      {: RESULT = new ExpBinOp (ExpBinOp.BinOp.TIMES, e1, e2); :}
00361:      |
00362:      multiplicative_expression:e1 DIVIDE cast_expression:e2
00363:      {: RESULT = new ExpBinOp (ExpBinOp.BinOp.DIVIDE, e1, e2); :}
00364:      |
00365:      multiplicative_expression:e1 MOD cast_expression:e2
00366:      {: RESULT = new ExpBinOp (ExpBinOp.BinOp.MOD, e1, e2); :}
00367:      ;
00368: 
00369: cast_expression
00370:  ::= unary_expression:e
00371:      {: RESULT = e; :}
00372:      ;
00373:      /* ignored cases */
00374: 
00375: unary_expression
00376:  ::= postfix_expression:e
00377:      {: RESULT = e; :}
00378:      |
00379:      unary_operator:op cast_expression:e
00380:      {: RESULT = new ExpUnOp (op, e); :}
00381:      ;
00382:      /* ignored cases: PLUSPLUS, MINUSMINUS */
00383: 
00384: unary_operator
00385:  ::= MINUS 
00386:      {: RESULT = ExpUnOp.UnOp.MINUS; :}
00387:      |
00388:      BANG
00389:      {: RESULT = ExpUnOp.UnOp.BANG; :}
00390:      ;
00391: 
00392: postfix_expression
00393:  ::= primary_expression:e
00394:      {: RESULT = e; :}
00395:      |
00396:      postfix_expression:e1 LBRACK expression:e2 RBRACK
00397:      {: RESULT = new ExpArrayAccess (e1, e2); :}  
00398:      |
00399:      IDENTIFIER:name LPAREN argument_expression_list_opt:l RPAREN
00400:      {: RESULT = new ExpFunCall (name, l); :} 
00401:      ;
00402:      /* ignored cases: PLUSPLUS, MINUSMINUS */
00403: 
00404: primary_expression
00405:  ::= IDENTIFIER:e
00406:      {: RESULT = new ExpVar (e); :}
00407:      |
00408:      constant:e
00409:      {: RESULT = e; :}
00410:      |
00411:      NEW type_specifier:t LBRACK expression:e RBRACK
00412:      {: RESULT = new ExpNew (t, e); :}
00413:      |
00414:      LPAREN expression:e type_assertion_opt:to RPAREN
00415:      {: RESULT = to.isEmpty () ? e : e.setType (to.get ()); :} 
00416:      ;
00417: 
00418: type_assertion_opt
00419:  ::= COLONCOLON type_specifier:t
00420:      {: RESULT = new Optional<Type> (t); :}
00421:      |
00422:      {: RESULT = new Optional<Type> (); :}
00423:      ;
00424: 
00425: argument_expression_list_opt
00426:  ::= argument_expression_list:l
00427:      {: RESULT = l; :}
00428:      | 
00429:      {: RESULT = List.<Exp>nil (); :}
00430:      ;
00431: 
00432: argument_expression_list
00433:  ::= assignment_expression:e
00434:      {: RESULT = List.<Exp>singleton (e); :} 
00435:      | 
00436:      argument_expression_list:l COMMA assignment_expression:e
00437:      {: RESULT = l.snoc (e); :} 
00438:      ;
00439: 
00440: constant
00441:  ::= INTEGER_CONSTANT:e
00442:      {: RESULT = new ExpInt (e.intValue ()); :}
00443:      |
00444:      CHARACTER_CONSTANT:e
00445:      {: RESULT = new ExpInt (0xffff & e.charValue ()); :}
00446:      |
00447:      STRING_CONSTANT:e
00448:      {: RESULT = new ExpString (e); :}
00449:      ;
00450: 
00451: 

Previous pageContentsNext page