| 798 | } |
| 799 | |
| 800 | bool 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 }; |
no test coverage detected