MCPcopy Create free account
hub / github.com/WheretIB/nullc / ParseEnum

Function ParseEnum

NULLC/Parser.cpp:800–874  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

798}
799
800bool ParseEnum(Lexeme** str)
801{
802 if(!ParseLexem(str, lex_enum))
803 return false;
804
805 SetCurrentAlignment(0);
806 if((*str)->type != lex_string)
807 ThrowError((*str)->pos, "ERROR: class name expected");
808 TypeBegin((*str)->pos, (*str)->pos+(*str)->length);
809 (*str)++;
810
811 TypeInfo *enumType = GetDefinedType();
812 enumType->type = TypeInfo::TYPE_INT;
813 enumType->stackType = podTypeToStackType[TypeInfo::TYPE_INT];
814 enumType->dataType = podTypeToDataType[TypeInfo::TYPE_INT];
815
816 if(!ParseLexem(str, lex_ofigure))
817 ThrowError((*str)->pos, "ERROR: '{' not found after class name");
818 TypeInfo::MemberVariable *prevConst = NULL;
819 do
820 {
821 if((*str)->type != lex_string)
822 ThrowError((*str)->pos, "ERROR: enumeration name expected after %s", prevConst ? "','" : "{");
823 if((*str)->length >= NULLC_MAX_VARIABLE_NAME_LENGTH)
824 ThrowError((*str)->pos, "ERROR: enumeration name length is limited to 2048 symbols");
825 unsigned int memberNameLength = (*str)->length;
826 char *memberName = (char*)stringPool.Allocate(memberNameLength + 2);
827 memcpy(memberName, (*str)->pos, memberNameLength);
828 memberName[memberNameLength] = 0;
829 (*str)++;
830 if(!ParseLexem(str, lex_set))
831 {
832 if(!prevConst)
833 {
834 CodeInfo::nodeList.push_back(new NodeNumber(0, enumType));
835 }else{
836 CodeInfo::nodeList.push_back(prevConst->defaultValue);
837 CodeInfo::nodeList.push_back(new NodeNumber(1, enumType));
838 AddBinaryCommandNode((*str)->pos, cmdAdd);
839 }
840 }else{
841 if(!ParseTernaryExpr(str))
842 ThrowError((*str)->pos, "ERROR: expression not found after '='");
843 }
844 SelectTypeByPointer(typeInt);
845 TypeAddConstant((*str)->pos, memberName);
846 enumType->lastVariable->defaultValue->typeInfo = enumType;
847 prevConst = enumType->lastVariable;
848 }while(ParseLexem(str, lex_comma));
849 if(!ParseLexem(str, lex_cfigure))
850 ThrowError((*str)->pos, "ERROR: '}' not found after enum definition");
851
852 TypeFinish();
853 enumType->size = 4;
854
855 // Add conversion operator int int(enum_type) and enum_type enum_type(int)
856 TypeInfo *target[] = { typeInt, enumType };
857 TypeInfo *source[] = { enumType, typeInt };

Callers 1

ParseExpressionFunction · 0.85

Calls 15

ParseLexemFunction · 0.85
SetCurrentAlignmentFunction · 0.85
ThrowErrorFunction · 0.85
TypeBeginFunction · 0.85
GetDefinedTypeFunction · 0.85
AddBinaryCommandNodeFunction · 0.85
ParseTernaryExprFunction · 0.85
SelectTypeByPointerFunction · 0.85
TypeAddConstantFunction · 0.85
TypeFinishFunction · 0.85
FunctionAddFunction · 0.85
FunctionParameterFunction · 0.85

Tested by

no test coverage detected