public StructureDefine(string S) { operationString = "List values"; //returnType = new ValueType(VT.Cadress); ValueType curVt = new ValueType(VT.Cunknown); values = new List <IOperation>(); if (S.Length == 0) { return; } string[] sSplited = MISC.splitBy(S, ',').ToArray(); for (int i = 0; i < sSplited.Length; i++) { try { values.Add(BinaryOperation.ParseFrom(sSplited[i])); if (i > 0 && curVt != values[values.Count - 1].returnTypes()) { throw new Exception("Define struct must contain only monotype args"); } curVt = values[values.Count - 1].returnTypes(); } catch (Exception e) { throw new Exception("Can not parse define from \"" + sSplited[i] + "\""); } } returnType = curVt.TypeOfPointerToThis(); }
public Define(string s, bool autoAssume) { //string firstPart = s.Substring(0, s.IndexOf("$") + 1); // int&a,b //while (s.IndexOf(',') > 0) //{ // int at = s.IndexOf(','); // s = s.Substring(0, s.IndexOf(',')) + ';' + firstPart + s.Substring(s.IndexOf(',') + 1); // // //} string[] ss = s.Split('$'); //string varName; VT varType; bool everDefined = false; for (int i = 0; i < ASTTree.variables.Count; i++) { if (ASTTree.variables[i].name == ss[1] && MISC.isVariableAvailable(i)) { everDefined = true; break; } } if (ss[1].Length > 0 && !everDefined) { varName = ss[1]; } else { throw new Exception("Can not define " + ((everDefined) ? "again " : "") + "variable with name \"" + ss[1] + "\""); } ss[0].ToLower(); varType = detectType(ss[0]); //for (int i =0; i < varName.Length; i++){ //bool isPointer = false; int pointerLevel = 0; while (varName.IndexOf('*') == 0) { pointerLevel++; varName = varName.Substring(1); } returnType = new ValueType(varType, pointerLevel); defineType = returnType; //____________________________________ if (varName.LastIndexOf("]") == varName.Length - 1 && varName.IndexOf("[") > 0) { List <string> inBr = MISC.splitByQuad(varName); // [] [] [ ] [] varName = varName.Substring(0, varName.IndexOf('[')); for (int ib = 0; ib < inBr.Count; ib++) { string inBrack = inBr[ib]; int length = 0; if (inBrack != "") { IOperation arrayLength = BinaryOperation.ParseFrom(inBrack); if (arrayLength.returnTypes() != VT.Cint) { throw new Exception("Int only can be array length parameter"); } //IOperation arrayLength = BinaryOperation.ParseFrom(inBrack); //if (arrayLength as ASTvalue == null || arrayLength.returnTypes() != VT.Cint) // throw new Exception("Incorrect array length parameters!"); //length = (int)(arrayLength as ASTvalue).getValue; //if (length < 1) // throw new Exception("Array length should be 1 and more!"); } //for (int i = 0; i < length; i++) //{ // // as default variable // ASTvariable newVar = new ASTvariable(new ValueType(varType, pointerLevel), varName + "#" + i, 0); // ASTTree.variables.Add(newVar); // MISC.pushVariable(ASTTree.variables.Count - 1); // ASTTree.tokens.Add(newVar); //} defineType = defineType.TypeOfPointerToThis(); } } //_________________________________________ ASTvariable NV = new ASTvariable(defineType, varName, pointerLevel, MISC.GetCurrentVariableAdressType()); var = NV; ASTTree.variables.Add(NV); MISC.pushVariable(ASTTree.variables.Count - 1); if (autoAssume) { MISC.defineVariable(ASTTree.variables.Count - 1); } ASTTree.tokens.Add(NV); a = NV; returnType = a.returnTypes(); b = new ASTvalue(new ValueType(VT.Cadress), (object)(ASTTree.variables.Count - 1)); }
public static string Load(ValueType vtLoad, string from) { return(String.Format("load {0}, {1}, align {2}", vtLoad.TypeOfPointerToThis().ToLLVM(), from, MISC.SyzeOf(vtLoad.TypeOfPointerToThis()))); }