void compileBlock(void) { Object* constObj; ConstantValue* constValue; if (lookAhead->tokenType == KW_CONST) { eat(KW_CONST); do { eat(TK_IDENT); checkFreshIdent(currentToken->string); constObj = createConstantObject(currentToken->string); eat(SB_EQ); constValue = compileConstant(); constObj->constAttrs->value = constValue; declareObject(constObj); eat(SB_SEMICOLON); } while (lookAhead->tokenType == TK_IDENT); compileBlock2(); } else compileBlock2(); }
void compileBlock(void) { Object* constObj; ConstantValue* constValue; if (lookAhead->tokenType == KW_CONST) { eat(KW_CONST); do { eat(TK_IDENT); // TODO: Check if a constant identifier is fresh in the block checkFreshIdent(currentToken->string); // Create a constant object constObj = createConstantObject(currentToken->string); eat(SB_EQ); // Get the constant value constValue = compileConstant(); constObj->constAttrs->value = constValue; // Declare the constant object declareObject(constObj); eat(SB_SEMICOLON); } while (lookAhead->tokenType == TK_IDENT); compileBlock2(); } else compileBlock2(); }
void compileBlock(void) { // TODO: create and declare constant objects# Object * obj = NULL; if (lookAhead->tokenType == KW_CONST) { eat(KW_CONST); do { eat(TK_IDENT); obj = createConstantObject(currentToken->string); eat(SB_EQ); obj->constAttrs->value = compileConstant(); eat(SB_SEMICOLON); declareObject(obj); } while (lookAhead->tokenType == TK_IDENT); compileBlock2(); } else compileBlock2(); }
int main() { Object* obj; initSymTab(); obj = createProgramObject("PRG"); enterBlock(obj->progAttrs->scope); obj = createConstantObject("c1"); obj->constAttrs->value = makeIntConstant(10); declareObject(obj); obj = createConstantObject("c2"); obj->constAttrs->value = makeCharConstant('a'); declareObject(obj); obj = createTypeObject("t1"); obj->typeAttrs->actualType = makeArrayType(10, makeIntType()); declareObject(obj); obj = createVariableObject("v1"); obj->varAttrs->type = makeIntType(); declareObject(obj); obj = createVariableObject("v2"); obj->varAttrs->type = makeArrayType(10, makeArrayType(10, makeIntType())); declareObject(obj); obj = createFunctionObject("f"); obj->funcAttrs->returnType = makeIntType(); declareObject(obj); enterBlock(obj->funcAttrs->scope); obj = createParameterObject("p1", PARAM_VALUE, symtab->currentScope->owner); obj->paramAttrs->type = makeIntType(); declareObject(obj); obj = createParameterObject("p2", PARAM_REFERENCE, symtab->currentScope->owner); obj->paramAttrs->type = makeCharType(); declareObject(obj); exitBlock(); obj = createProcedureObject("p"); declareObject(obj); enterBlock(obj->procAttrs->scope); obj = createParameterObject("v1", PARAM_VALUE, symtab->currentScope->owner); obj->paramAttrs->type = makeIntType(); declareObject(obj); obj = createConstantObject("c1"); obj->constAttrs->value = makeCharConstant('a'); declareObject(obj); obj = createConstantObject("c3"); obj->constAttrs->value = makeIntConstant(10); declareObject(obj); obj = createTypeObject("t1"); obj->typeAttrs->actualType = makeIntType(); declareObject(obj); obj = createTypeObject("t2"); obj->typeAttrs->actualType = makeArrayType(10, makeIntType()); declareObject(obj); obj = createVariableObject("v2"); obj->varAttrs->type = makeArrayType(10, makeIntType()); declareObject(obj); obj = createVariableObject("v3"); obj->varAttrs->type = makeCharType(); declareObject(obj); exitBlock(); exitBlock(); printObject(symtab->program, 0); cleanSymTab(); return 0; }