Unnamed paste
pasted by Unknown [options]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 | program : functions { treeRoot = mProgram($1); } ; functions : functions function { $$ = connectFunctions($1, $2); } | function { $$ = $1 } ; function : BASIC_TYPE ID '(' formals ')' '{' decls stmnts '}' { $$ = mFunction(connectVariables($4, $7), $8, $2.strVal, $1.type, yylineno); } ; formals : formals_non_emtpty { $$ = $1 } | {$$ = NULL;} ; formals_non_emtpty : formals_non_emtpty ',' formal { $$ = connectVariables($1, $3); } | formal { $$ = $1 } ; formal : BASIC_TYPE ID { $$ = mVariable(kFormal, $2.strVal, $1.type, yylineno); } ; decls : decls decl { $$ = connectVariables($1, $2); } | { $$ = NULL; } ; decl : BASIC_TYPE idents ';' { $$ = addType($2, $1.type); } ; idents : idents ',' ident { $$ = connectVariables($1, $3); } | ident { $$ = $1 } ; ident : ID { $$ = mVariable(kLocal, $1.strVal, 0, yylineno); } ; stmnts : stmnts stmnt { $$ = connectStmnts($1, $2); } | stmnt { $$ = $1 } ; stmnt : ID '=' expr ';' { $$ = mAssign($1.strVal, $3, yylineno); } | IF '(' expr ')' stmnt ELSE stmnt { $$ = mIf($3, $5, $7, yylineno); } | IF '(' expr ')' stmnt { $$ = mIf($3, $5, NULL, yylineno); } | WHILE '(' expr ')' stmnt { $$ = mWhile($3, $5, yylineno); } | RETURN expr ';' { $$ = mReturn($2, yylineno); } | READ ID ';' { $$ = mRead($2.strVal, yylineno); } | WRITE expr ';' { $$ = mWrite($2, yylineno); } | '{' stmnts '}' { $$ = $2 } | ID '(' actuals ')' ';' { $$ = mFuncCallStmnt($3, $1.strVal, yylineno); } ; expr : MINUSOP expr %prec UNOP { $$ = mUnary($1.opType, $2, yylineno); } | NOTOP expr { $$ = mUnary($1.opType, $2, yylineno); } | expr PLUSOP expr { $$ = mBinary($1, $2.opType, $3, yylineno); } | expr MINUSOP expr { $$ = mBinary($1, $2.opType, $3, yylineno); } | expr MULOP expr { $$ = mBinary($1, $2.opType, $3, yylineno); } | expr ANDOP expr { $$ = mBinary($1, $2.opType, $3, yylineno); } | expr OROP expr { $$ = mBinary($1, $2.opType, $3, yylineno); } | expr RELOP expr { $$ = mBinary($1, $2.opType, $3, yylineno); } |'(' expr ')' { $$ = $2 } | ID '(' actuals ')' { $$ = mFuncCallExpr($3, $1.strVal, yylineno); } | ID { $$ = mRValue($1.strVal, yylineno); } | INT_CONST { $$ = mIntConst($1.intVal, yylineno); } | BOOL_CONST { $$ = mBoolConst($1.intVal, yylineno); } | STRING_CONST { $$ = mStringConst($1.strVal, yylineno); } ; actuals : exprs { $$ = $1 } | {$$ = NULL;} ; exprs : exprs ',' expr { connectActuals($1, mActual($3)) } | expr { $$ = mActual($1); } ; |