private int BuildFunction(int index, WrapperObject functionObject, bool isStruct) { int holderValue = 1; WrapperObject parameters = new WrapperObject("PARAMETERS"); index = RulesUtility.ValidateToken(this.TokenList[index], "(", "This needs is a valid \'(\'.", index); while (this.TokenList[index] != ")") { WrapperObject parameter = new WrapperObject($"PARAMETER_{holderValue++}"); if (RulesUtility.IsValidType(this.ProgramTypeLanguage, this.TokenList[index])) { string valueName = this.TokenList[index++]; if (this.TokenList[index] == "[") { valueName += "[]"; index += 2; } parameter.Value.Add(new WrapperString("VALUE_TYPE", valueName)); parameter.Value.Add(new WrapperString("PARAM_NAME", this.TokenList[index++])); if (this.TokenList[index] == ")") { parameters.Value.Add(parameter); break; } index = RulesUtility.ValidateToken(this.TokenList[index], ",", "This needs is a valid \',\'.", index); } else { throw new Exception("This is an invalid parameter type."); } parameters.Value.Add(parameter); } if (isStruct && parameters.Value.Count < 0) { throw new Exception("You cannot have a default constructor for a struct object."); } else if (parameters.Value.Count > 0) { functionObject.Value.Add(parameters); } index = RulesUtility.ValidateToken(this.TokenList[index], ")", "This needs is a valid \')\'.", index); index = RulesUtility.ValidateToken(this.TokenList[index], "{", "This needs is a valid \'{\'.", index); WrapperObject functionContent = new WrapperObject("FUNCTION_CONTENT"); index = this.FillFunctionContent(index, functionContent); functionObject.Value.Add(functionContent); index = RulesUtility.ValidateToken(this.TokenList[index], "}", "This needs is a valid \'}\'.", index); return(index); }
private int BuildClassContent(int index, WrapperObject classObject) { WrapperObject classContent = new WrapperObject("OBJECT_CONTENT"); while (this.TokenList[index] != "}") { WrapperObject contentObject = new WrapperObject(); if (RulesUtility.ValidAccessModifiers(this.ProgramTypeLanguage, this.TokenList[index])) { contentObject.Value.Add(new WrapperString("ACCESS_MOD", this.TokenList[index++].ToLower())); } else { var classObjectAccessMod = (WrapperString)classObject.GetValue("ACCESS_MOD"); contentObject.Value.Add(new WrapperString("ACCESS_MOD", classObjectAccessMod.Value)); } if (this.TokenList[index].ToLower() == "static") { contentObject.Value.Add(new WrapperBool("IS_STATIC", true)); index++; } else if (this.TokenList[index].ToLower() == "enum") { index = this.AddClassLikeType(index, contentObject, classContent, "enum"); continue; } else { contentObject.Value.Add(new WrapperBool("IS_STATIC", false)); } if (this.TokenList[index].ToLower() == "final") { contentObject.Value.Add(new WrapperBool("IS_CONST", true)); index++; } else { contentObject.Value.Add(new WrapperBool("IS_CONST", false)); } if (this.TokenList[index] == "class") { index = this.AddClassLikeType(index, contentObject, classContent, "class"); continue; } if (this.TokenList[index + 1] != "(") { if (RulesUtility.IsValidType(this.ProgramTypeLanguage, this.TokenList[index])) { string valueType = this.TokenList[index++]; if (this.TokenList[index] == "<") { while (this.TokenList[index] != ">") { valueType += this.TokenList[index++]; } valueType += this.TokenList[index++]; } contentObject.Value.Add(new WrapperString("VALUE_TYPE", valueType)); } else { throw new Exception("This is an invalid return/set type."); } } if (this.TokenList[index].ToUpper() == this.TokenList[index]) { string constName = string.Empty; while (this.TokenList[index] != "=") { constName += this.TokenList[index++]; } contentObject.WrapperName = constName; index--; } else { contentObject.WrapperName = this.TokenList[index]; } if (this.TokenList[index][0] == '_' || (this.TokenList[index][0] >= 'A' && this.TokenList[index][0] <= 'Z' && this.TokenList[index + 1] != "{" && this.TokenList[index + 1] != "(")) { contentObject.WrapperName = this.TokenList[index++]; index = this.BuildClassProperty(index, contentObject); } else { index++; WrapperBool isConst = (WrapperBool)contentObject.GetValue("IS_CONST"); if (isConst.Value) { throw new Exception("This cannot use constant for auto property and function."); } index = this.BuildFunction(index, contentObject); } classContent.Value.Add(contentObject); } classObject.Value.Add(classContent); return(index); }