3 #define YYLTYPE Location
7 char * defaultNameSpace;
8 int defaultNameSpaceLen;
9 public void SetDefaultNameSpace(char * s) { defaultNameSpace = s; defaultNameSpaceLen = s ? strlen(s) : 0; }
11 bool strictNameSpaces;
12 public void SetStrictNameSpaces(bool b) { strictNameSpaces = b; }
14 AccessMode declMode = privateAccess;
15 AccessMode structDeclMode = privateAccess;
17 public void SetDeclMode(AccessMode accessMode) { structDeclMode = declMode = accessMode; }
18 AccessMode defaultDeclMode = privateAccess;
19 public void SetDefaultDeclMode(AccessMode accessMode) { defaultDeclMode = accessMode; }
21 char * currentNameSpace;
22 int currentNameSpaceLen;
23 public void SetCurrentNameSpace(char * s) { currentNameSpace = s; currentNameSpaceLen = s ? strlen(s) : 0; }
26 Time findClassTotalTime;
27 Time checkTypeTotalTime;
28 Time externalImportTotalTime;
29 Time findClassIgnoreNSTotalTime;
32 public OldList * MkList()
34 return new0 OldList[1];
37 public OldList * MkListOne(void * item)
39 OldList * list = new0 OldList[1];
44 void ListAdd(OldList list, void * item)
50 void ListAddFront(OldList list, void * item)
53 list.Insert(null, item);
56 public Identifier MkIdentifier(char * string)
61 id._class = null; // Default class...
66 bool gotColon = false;
67 for(c = strlen(string)-1; c >= 0; c--)
74 namePart = string+c+1;
75 while(c >= 0 && string[c] == ':') c--;
81 memcpy(name, string, c+1);
83 // TODO: Do these better, keep in string?
84 if(!strcmp(name, "typed_object"))
86 id._class = MkSpecifierName("typed_object"); //"class");
87 id.string = CopyString(namePart);
89 else if(!strcmp(name, "property"))
91 id._class = MkSpecifierName("property");
92 id.string = CopyString(namePart);
94 else if(!strcmp(name, "typed_object&"))
96 id._class = MkSpecifierName("typed_object&");
97 id.string = CopyString(namePart);
99 else if(!strcmp(name, "any_object"))
101 id._class = MkSpecifierName("any_object");
102 id.string = CopyString(namePart);
106 TemplatedType templatedType = FindTemplateTypeParameter(curContext, name);
109 id._class = Specifier { type = templateTypeSpecifier, templateParameter = templatedType.param };
110 //id._class = MkSpecifierName(name);
111 id.string = CopyString(namePart);
115 symbol = FindClass(name);
118 id._class = _MkSpecifierName(symbol.string, symbol, null);
119 id.string = CopyString(namePart);
122 id.string = CopyString(string);
128 id._class = MkSpecifierName(null);
129 id.string = CopyString(namePart);
132 id.string = CopyString(string);
135 id.string = CopyString("");
139 public TemplateParameter MkTypeTemplateParameter(Identifier identifier, TemplateDatatype baseTplDatatype, TemplateArgument defaultArgument)
141 if(identifier.string)
143 TemplateParameter param { type = TemplateParameterType::type, identifier = identifier, dataType = baseTplDatatype, defaultArgument = defaultArgument };
144 TemplatedType type { key = (uintptr)identifier.string, param = param };
145 if(!curContext.templateTypes.Add((BTNode)type))
152 public TemplateParameter MkIdentifierTemplateParameter(Identifier identifier, TemplateMemberType memberType, TemplateArgument defaultArgument)
154 if(identifier.string)
156 TemplateParameter param { type = TemplateParameterType::identifier, identifier = identifier, memberType = memberType, defaultArgument = defaultArgument };
162 public TemplateParameter MkExpressionTemplateParameter(Identifier identifier, TemplateDatatype dataType, TemplateArgument defaultArgument)
164 if(identifier.string)
166 TemplateParameter param { type = TemplateParameterType::expression, identifier = identifier, dataType = dataType, defaultArgument = defaultArgument };
172 public TemplateDatatype MkTemplateDatatype(OldList * specifiers, Declarator decl)
174 TemplateDatatype datatype { specifiers = specifiers, decl = decl };
178 public TemplateArgument MkTemplateTypeArgument(TemplateDatatype tplDatatype)
180 TemplateArgument argument { type = type, templateDatatype = tplDatatype };
184 public TemplateArgument MkTemplateExpressionArgument(Expression expr)
186 TemplateArgument argument { type = expression, expression = expr };
190 public TemplateArgument MkTemplateIdentifierArgument(Identifier ident)
192 TemplateArgument argument { type = identifier, identifier = ident };
196 Expression MkExpExtensionCompound(Statement compound)
198 return { type = extensionCompoundExp, compound = compound };
201 Expression MkExpExtensionExpression(OldList * expressions)
203 return { type = extensionExpressionExp, list = expressions, loc = yylloc };
206 Expression MkExpExtensionInitializer(TypeName typeName, Initializer initializer)
208 return { type = extensionInitializerExp, initializer.typeName = typeName, initializer.initializer = initializer, loc = yylloc };
211 public Expression MkExpIdentifier(Identifier id)
213 return { type = identifierExp, identifier = id };
216 public Expression MkExpDummy()
218 Expression exp { type = dummyExp };
222 public Expression MkExpConstant(char * string)
224 return { type = constantExp, constant = CopyString(string) };
227 Expression MkExpString(char * string)
229 return { type = stringExp, string = CopyString(string) };
232 // TODO: String is case sensitive..
233 // What should we do about it?
234 /*public class CaseSensitiveString : String
236 int OnCompare(CaseSensitiveString string2)
240 result = strcmpi(this, string2);
241 else if(!this && string2)
243 else if(this && !string2)
249 public struct ContextStringPair
251 String string, context;
253 // TODO: Should this be automated somehow?
260 int OnCompare(ContextStringPair b)
263 result = (string && b.string) ? strcmp(string, b.string) :
264 (!string && b.string) ? 1 : (string && !b.string) ? -1 : 0;
265 if(result) return result;
267 result = (context && b.context) ? strcmp(context, b.context) :
268 (!context && b.context) ? 1 : (context && !b.context) ? -1 : 0;
269 // TODO: Support these
270 // result = CaseSensitiveString::OnCompare(string, b.string);
271 // result = ((CaseSensitiveString)string).OnCompare(b.string);
276 Map<ContextStringPair, List<Location>> intlStrings { };
278 Expression MkExpIntlString(char * string, char * context)
282 OldList * list = MkList();
285 ContextStringPair pair { };
287 int len = strlen(string);
289 pair.string = new byte[len-2+1]; memcpy(pair.string, string+1, len-2); pair.string[len-2] = '\0';
290 if(context) { len = strlen(context); pair.context = new byte[len-2+1]; memcpy(pair.context, context+1, len-2); pair.context[len-2] = '\0'; }
292 list = intlStrings[pair];
296 intlStrings[pair] = list;
305 //ListAdd(list, QMkExpId("__thisModule"));
306 ListAdd(list, MkExpString(QMkString(i18nModuleName ? i18nModuleName : "")));
307 ListAdd(list, MkExpString(string));
310 int lenString = strlen(string), lenContext = strlen(context);
311 char * msgid = new char[lenString-2 + lenContext-2 + 4];
313 memcpy(msgid+1, context+1, lenContext-2);
314 msgid[1+lenContext-2] = 4; // EOT
315 memcpy(msgid+1+lenContext-2+1, string+1, lenString-2);
316 memcpy(msgid+1+lenContext-2+1+lenString-2, "\"", 2);
317 ListAdd(list, MkExpString(msgid));
321 ListAdd(list, QMkExpId("null"));
322 return MkExpCall(QMkExpId("GetTranslatedString"), list);
326 Expression e = MkExpString(string);
332 Expression MkExpOp(Expression exp1, int op, Expression exp2)
343 exp.loc.start = exp1 ? exp1.loc.start : exp2.loc.start;
344 exp.loc.end = exp2 ? exp2.loc.end : exp1.loc.end;
349 Expression MkExpBrackets(OldList expressions)
356 if(expressions && expressions.first)
358 exp.loc.start = ((Expression)expressions.first).loc.start;
359 exp.loc.end = ((Expression)expressions.last).loc.end;
364 Expression MkExpIndex(Expression expression, OldList index)
366 return { type = indexExp, index.exp = expression, index.index = index };
369 Expression MkExpCall(Expression expression, OldList arguments)
371 return { type = callExp, call.exp = expression, call.arguments = arguments };
374 Expression MkExpMember(Expression expression, Identifier member)
376 return { type = memberExp, member.exp = expression, member.member = member };
379 Expression MkExpPointer(Expression expression, Identifier member)
381 return { type = pointerExp, member.exp = expression, member.member = member };
384 Expression MkExpTypeSize(TypeName typeName)
386 return { type = typeSizeExp, typeName = typeName };
389 Expression MkExpTypeAlign(TypeName typeName)
391 return { type = typeAlignExp, typeName = typeName };
394 Expression MkExpClassSize(Specifier _class)
396 return { type = classSizeExp, _class = _class };
399 Expression MkExpCast(TypeName typeName, Expression expression)
401 return { type = castExp, cast.typeName = typeName, cast.exp = expression };
404 Expression MkExpCondition(Expression cond, OldList expressions, Expression elseExp)
406 return { type = conditionExp, cond.cond = cond, cond.exp = expressions, cond.elseExp = elseExp };
409 Expression MkExpRenew(Expression memExp, TypeName type, Expression size)
411 return { type = renewExp, _renew.exp = memExp, _renew.typeName = type, _renew.size = size };
414 Expression MkExpRenew0(Expression memExp, TypeName type, Expression size)
416 return { type = renew0Exp, _renew.exp = memExp, _renew.typeName = type, _renew.size = size };
419 Expression MkExpNew(TypeName type, Expression size)
421 return { type = newExp, _new.typeName = type, _new.size = size };
424 Expression MkExpNew0(TypeName type, Expression size)
426 return { type = new0Exp, _new.typeName = type, _new.size = size };
429 Expression MkExpVaArg(Expression exp, TypeName type)
431 return { type = vaArgExp, vaArg.exp = exp, vaArg.typeName = type };
434 Specifier MkSpecifier(int specifier)
436 if(specifier == _BOOL && (declMode != defaultAccess && defaultDeclMode != defaultAccess))
437 return MkSpecifierName("bool");
438 else if(specifier == _BOOL || specifier == BOOL)
439 return { type = baseSpecifier, specifier = specifier };
441 return { type = baseSpecifier, specifier = specifier };
444 Specifier MkSpecifierTypeOf(Expression expression)
446 return { type = typeOfSpecifier, expression = expression };
449 Specifier MkSpecifierSubClass(Specifier _class)
451 return { type = subClassSpecifier, _class = _class };
454 Specifier MkSpecifierExtended(ExtDecl extDecl)
456 return { type = extendedSpecifier, extDecl = extDecl /*name = CopyString(name)*/ };
459 Specifier MkEnum(Identifier id, OldList list)
463 type = enumSpecifier;
467 if(list && (!declMode || !id))
473 type = ProcessType(&specs, null);
477 Symbol symbol { string = CopyString(id.string), isStruct = true, type = type };
479 if(strstr(symbol.string, "::"))
480 curContext.hasNameSpace = true;
481 if(!curContext.structSymbols.Add((BTNode)symbol))
484 for(e = list.first; e; e = e.next)
486 Symbol symbol { string = CopyString(e.id.string), type = type };
488 if(strstr(symbol.string, "::"))
489 curContext.hasNameSpace = true;
490 if(!(curContext.templateTypesOnly ? curContext.parent : curContext).symbols.Add((BTNode)symbol))
498 Specifier MkStructOrUnion(SpecifierType type, Identifier id, OldList definitions)
500 Specifier spec { type = type, id = id };
501 if(id && FindType(curContext, id.string))
502 structDeclMode = defaultAccess;
503 spec.definitions = definitions;
504 if(definitions && id && structDeclMode == defaultAccess)
509 symbol = Symbol { string = CopyString(id.string), type = ProcessType(specs, null), isStruct = true };
510 if(!curContext.structSymbols.Add((BTNode)symbol))
516 void AddStructDefinitions(Specifier spec, OldList definitions)
518 spec.definitions = definitions;
519 if(definitions && spec.id && !declMode)
524 symbol = Symbol { string = CopyString(spec.id.string), type = ProcessType(specs, null), isStruct = true };
525 if(!curContext.parent.structSymbols.Add((BTNode)symbol))
530 Attribute MkAttribute(String attr, Expression exp)
532 return { attr = attr, exp = exp };
535 Attrib MkAttrib(int type, OldList * attribs)
537 return { type = type, attribs = attribs };
540 ExtDecl MkExtDeclString(String s)
542 return { type = extDeclString, s = s };
546 ExtDecl MkExtDeclAttrib(Attrib attr)
548 return { type = extDeclAttrib, attr = attr };
552 public Declarator MkDeclaratorIdentifier(Identifier id)
554 return { type = identifierDeclarator, identifier = id };
557 Declarator MkDeclaratorFunction(Declarator declarator, OldList parameters)
559 return { type = functionDeclarator, declarator = declarator, function.parameters = parameters };
562 Declarator MkDeclaratorExtended(ExtDecl extended, Declarator declarator)
564 return { type = extendedDeclarator, declarator = declarator, extended.extended = extended };
567 Declarator MkDeclaratorExtendedEnd(ExtDecl extended, Declarator declarator)
569 return { type = extendedDeclaratorEnd, declarator = declarator, extended.extended = extended };
572 Declarator MkStructDeclarator(Declarator declarator, Expression exp)
574 return { type = structDeclarator, declarator = declarator, structDecl.exp = exp };
577 Declarator MkDeclaratorBrackets(Declarator declarator)
579 return { type = bracketsDeclarator, declarator = declarator };
582 Declarator MkDeclaratorArray(Declarator declarator, Expression exp)
584 return { type = arrayDeclarator, declarator = declarator, array.exp = exp };
587 Declarator MkDeclaratorEnumArray(Declarator declarator, Specifier _class)
589 return { type = arrayDeclarator, declarator = declarator, array.enumClass = _class };
592 Declarator MkDeclaratorPointer(Pointer pointer, Declarator declarator)
594 return { type = pointerDeclarator, declarator = declarator, pointer.pointer = pointer };
597 Enumerator MkEnumerator(Identifier id, Expression exp)
599 return { id = id, exp = exp };
602 Pointer MkPointer(OldList qualifiers, Pointer pointer)
604 return { qualifiers = qualifiers, pointer = pointer };
607 Initializer MkInitializerAssignment(Expression exp)
609 /*if(yylloc.start.line == 1)
611 return { type = expInitializer, exp = exp, loc = yylloc };
614 Initializer MkInitializerList(OldList list)
616 /*if(yylloc.start.line == 1)
618 return { type = listInitializer, list = list, loc = yylloc };
621 InitDeclarator MkInitDeclarator(Declarator declarator, Initializer initializer)
623 return { declarator = declarator, initializer = initializer };
626 public TypeName MkTypeName(OldList qualifiers, Declarator declarator)
628 if(qualifiers != null)
630 Declarator parentDecl = declarator;
631 Declarator decl = declarator;
632 while(decl && decl.type == arrayDeclarator)
633 decl = decl.declarator;
634 if(decl && decl.type == identifierDeclarator && decl.identifier.string && CheckType(decl.identifier.string) == TYPE_NAME)
637 // Check if we're missing a real type specifier here
638 for(spec = qualifiers.first; spec; spec = spec.next)
640 if(spec.type == baseSpecifier)
642 if(spec.specifier == CONST || spec.specifier == VOLATILE ||
643 spec.specifier == EXTERN || spec.specifier == STATIC ||
644 spec.specifier == AUTO || spec.specifier == REGISTER)
648 else if(spec.type != extendedSpecifier)
653 // This is actually a type
654 ListAdd(qualifiers, MkSpecifierName(decl.identifier.string));
655 FreeDeclarator(decl);
656 parentDecl.declarator = null;
660 return { qualifiers = qualifiers, declarator = declarator };
663 public TypeName MkTypeNameGuessDecl(OldList qualifiers, Declarator declarator)
665 if(qualifiers != null)
667 bool gotType = false;
668 bool gotFullType = false;
669 Specifier spec, next;
670 for(spec = qualifiers.first; spec; spec = next)
673 if(gotType && !declarator && ((spec.type == nameSpecifier && spec.name) || (spec.type == baseSpecifier && gotFullType)))
676 if(spec.type == nameSpecifier)
678 char * colon = RSearchString(spec.name, "::", strlen(spec.name), true, false);
679 s = colon ? colon + 2 : spec.name;
681 else if(spec.type == baseSpecifier)
683 if(spec.specifier == INT64) s = "int64";
687 declarator = MkDeclaratorIdentifier(MkIdentifier(s));
688 qualifiers.Remove(spec);
693 if(spec && spec.type != extendedSpecifier)
695 if(spec.type == baseSpecifier)
697 if(spec.specifier == CONST || spec.specifier == VOLATILE ||
698 spec.specifier == EXTERN || spec.specifier == STATIC ||
699 spec.specifier == AUTO || spec.specifier == REGISTER)
701 else if(spec.specifier != UNSIGNED && spec.specifier != SIGNED && spec.specifier != LONG)
713 return { qualifiers = qualifiers, declarator = declarator };
716 public Identifier GetDeclId(Declarator decl)
718 while(decl && decl.type != identifierDeclarator)
719 decl = decl.declarator;
720 return decl ? decl.identifier : null;
723 Declaration MkDeclarationClassInst(Instantiation inst)
725 return { type = instDeclaration, inst = inst, loc = yylloc };
728 Declaration MkDeclarationInst(Instantiation inst)
730 Declaration decl { type = instDeclaration, inst = inst, loc = yylloc };
732 if(curContext == globalContext && (currentNameSpace || defaultNameSpace) && declMode != defaultAccess && defaultDeclMode != defaultAccess)
735 int len = 0, stringLen;
738 memcpy(name, defaultNameSpace, defaultNameSpaceLen);
739 len += defaultNameSpaceLen;
745 memcpy(name + len, currentNameSpace, currentNameSpaceLen);
746 len += currentNameSpaceLen;
751 stringLen = strlen(inst.exp.identifier.string);
752 memcpy(name + len, inst.exp.identifier.string, stringLen);
755 delete inst.exp.identifier.string;
756 inst.exp.identifier.string = CopyString(name);
761 string = (inst.exp.type == identifierExp) ? CopyString(inst.exp.identifier.string) : null;
762 type = MkClassTypeSymbol(inst._class.symbol);
764 symbol.idCode = symbol.id = curContext.nextID++;
765 if(strstr(symbol.string, "::"))
766 curContext.hasNameSpace = true;
767 if(!(curContext.templateTypesOnly ? curContext.parent : curContext).symbols.Add((BTNode)symbol))
768 excludedSymbols->Add(symbol);
769 decl.symbol = inst.symbol = symbol;
773 Declaration MkDeclarationDefine(Identifier id, Expression exp)
775 Declaration decl { type = defineDeclaration, id = id, exp = exp, loc = yylloc };
776 char expString[1024];
779 PrintExpression(exp, expString);
781 if(curContext == globalContext && (currentNameSpace || defaultNameSpace) && declMode != defaultAccess && defaultDeclMode != defaultAccess)
784 int len = 0, stringLen;
787 memcpy(name, defaultNameSpace, defaultNameSpaceLen);
788 len += defaultNameSpaceLen;
794 memcpy(name + len, currentNameSpace, currentNameSpaceLen);
795 len += currentNameSpaceLen;
799 stringLen = strlen(id.string);
800 memcpy(name + len, id.string, stringLen);
804 id.string = CopyString(name);
807 if(!eSystem_FindDefine(privateModule, id.string))
808 eSystem_RegisterDefine(id.string, expString, privateModule, buildingECERECOMModule ? baseSystemAccess : publicAccess);
810 Compiler_Warning($"Redefinition of %s ignored\n", id.string);
814 Declaration MkDeclaration(OldList specifiers, OldList initDeclarators)
816 Declaration decl { type = initDeclaration, declarators = initDeclarators, specifiers = specifiers, loc = yylloc };
817 bool variable = true;
819 if(specifiers != null)
821 bool gotType = false;
822 Specifier spec, next;
823 for(spec = specifiers.first; spec; spec = next)
826 if(spec.type == baseSpecifier && spec.specifier == TYPEDEF)
828 if(initDeclarators != null)
832 for(d = initDeclarators.first; d; d = d.next)
834 if(GetDeclId(d.declarator).string)
838 string = CopyString(GetDeclId(d.declarator).string);
839 type = ProcessType(specifiers, d.declarator);
841 type.id = type.idCode = curContext.nextID++;
843 if(!(curContext.templateTypesOnly ? curContext.parent : curContext).types.Add((BTNode)type))
844 excludedSymbols->Add(type);
845 decl.symbol = d.declarator.symbol = type;
851 //for(spec = spec.next; spec; spec = spec.next)
852 spec = specifiers.last;
854 if((spec.type == nameSpecifier && spec.name) || spec.type == baseSpecifier)
857 if(spec.type == nameSpecifier)
859 char * colon = RSearchString(spec.name, "::", strlen(spec.name), true, false);
860 s = colon ? colon + 2 : spec.name;
862 else if(spec.type == baseSpecifier)
864 if(spec.specifier == INT64) s = "int64";
868 Symbol type { string = CopyString(s), type = ProcessType(specifiers, null) };
869 type.id = type.idCode = curContext.nextID++;
871 decl.declarators = initDeclarators = MkListOne(MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier(s)), null));
872 specifiers.Remove(spec);
874 if(!(curContext.templateTypesOnly ? curContext.parent : curContext).types.Add((BTNode)type))
875 excludedSymbols->Add(type);
883 else if(spec.type == baseSpecifier &&
884 (spec.specifier == STRUCT || spec.specifier == UNION))
888 if(gotType && initDeclarators == null && !spec.next && ((spec.type == nameSpecifier && spec.name) || spec.type == baseSpecifier))
891 if(spec.type == nameSpecifier)
893 char * colon = RSearchString(spec.name, "::", strlen(spec.name), true, false);
894 s = colon ? colon + 2 : spec.name;
896 else if(spec.type == baseSpecifier)
898 if(spec.specifier == INT64) s = "int64";
902 decl.declarators = initDeclarators = MkListOne(MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier(s)), null));
903 specifiers.Remove(spec);
909 if(spec && spec.type != extendedSpecifier)
913 if(variable && initDeclarators)
916 for(d = initDeclarators.first; d; d = d.next)
918 Identifier id = GetDeclId(d.declarator);
919 if(id && id.string && id.string[0])
925 if(curContext == globalContext && (currentNameSpace || defaultNameSpace) && declMode != defaultAccess && defaultDeclMode != defaultAccess)
928 int len = 0, stringLen;
931 memcpy(name, defaultNameSpace, defaultNameSpaceLen);
932 len += defaultNameSpaceLen;
938 memcpy(name + len, currentNameSpace, currentNameSpaceLen);
939 len += currentNameSpaceLen;
943 stringLen = strlen(id.string);
944 memcpy(name + len, id.string, stringLen);
948 id.string = CopyString(name);
951 // Avoid memory leaks on duplicated symbols (BinaryTree::Add Would Fail)
952 symbol = (Symbol)(curContext.templateTypesOnly ? curContext.parent : curContext).symbols.FindString(id.string);
955 symbol = Symbol { string = CopyString(id.string), type = ProcessType(specifiers, d.declarator) };
956 if(strstr(symbol.string, "::"))
957 curContext.hasNameSpace = true;
958 if(!(curContext.templateTypesOnly ? curContext.parent : curContext).symbols.Add((BTNode)symbol))
959 excludedSymbols->Add(symbol);
960 // TODO: Add better support to count declarators
961 if(symbol.type && symbol.type.kind == arrayType && !symbol.type.arraySizeExp && d.initializer)
963 if(d.initializer.type == listInitializer)
966 sprintf(string, "%d",d.initializer.list->count);
967 symbol.type.arraySizeExp = MkExpConstant(string);
968 symbol.type.freeExp = true;
970 else if(d.initializer.type == expInitializer && d.initializer.exp.type == stringExp && d.initializer.exp.string)
975 bool escaped = false;
976 char * s = d.initializer.exp.string;
978 // MAKE MORE ACCURATE
979 for(c = 1; (ch = s[c]); c++)
981 if(ch == '\\' && !escaped)
990 sprintf(string, "%d", count);
991 symbol.type.arraySizeExp = MkExpConstant(string);
992 symbol.type.freeExp = true;
995 symbol.id = symbol.idCode = curContext.nextID++;
997 decl.symbol = d.declarator.symbol = symbol;
1004 decl.symbol = Symbol { };
1005 decl.symbol.id = decl.symbol.idCode = curContext.nextID++;
1006 excludedSymbols->Add(decl.symbol);
1011 Declaration MkStructDeclaration(OldList specifiers, OldList declarators, Specifier extStorage)
1013 Declaration decl { type = structDeclaration, declarators = declarators, specifiers = specifiers, extStorage = extStorage, loc = yylloc };
1014 if(specifiers != null)
1016 bool gotType = false;
1017 Specifier spec, next;
1018 for(spec = specifiers.first; spec; spec = next)
1021 if(gotType && declarators == null && ((spec.type == nameSpecifier && spec.name) || spec.type == baseSpecifier))
1024 if(spec.type == nameSpecifier)
1026 char * colon = RSearchString(spec.name, "::", strlen(spec.name), true, false);
1027 s = colon ? colon + 2 : spec.name;
1029 else if(spec.type == baseSpecifier)
1031 if(spec.specifier == INT64) s = "int64";
1035 decl.declarators = declarators = MkListOne(MkStructDeclarator(MkDeclaratorIdentifier(MkIdentifier(s)), null));
1036 specifiers.Remove(spec);
1037 FreeSpecifier(spec);
1041 if(spec && spec.type != extendedSpecifier)
1048 Statement MkLabeledStmt(Identifier id, Statement statement)
1050 return { type = labeledStmt, labeled.id = id, labeled.stmt = statement, loc = yylloc };
1053 Statement MkCaseStmt(Expression exp, Statement statement)
1055 return { type = caseStmt, caseStmt.exp = exp, caseStmt.stmt = statement, loc = yylloc };
1058 Statement MkCompoundStmt(OldList declarations, OldList statements)
1060 return { type = compoundStmt, compound.declarations = declarations, compound.statements = statements, loc = yylloc };
1063 Statement MkExpressionStmt(OldList expressions)
1065 return { type = expressionStmt, expressions = expressions, loc = yylloc };
1068 Statement MkBadDeclStmt(Declaration decl)
1070 return { type = badDeclarationStmt, decl = decl, loc = yylloc };
1073 Statement MkIfStmt(OldList exp, Statement statement, Statement elseStmt)
1075 return { type = ifStmt, ifStmt.exp = exp, ifStmt.stmt = statement, ifStmt.elseStmt = elseStmt, loc = yylloc };
1078 Statement MkSwitchStmt(OldList exp, Statement statement)
1080 // To know it's a switch compound... (Don't want declarations in there... bugs)
1082 statement.compound.isSwitch = true;
1083 return { type = switchStmt, switchStmt.exp = exp, switchStmt.stmt = statement, loc = yylloc };
1086 Statement MkWhileStmt(OldList exp, Statement statement)
1088 return { type = whileStmt, whileStmt.exp = exp, whileStmt.stmt = statement, loc = yylloc };
1091 Statement MkDoWhileStmt(Statement statement, OldList exp)
1093 return { type = doWhileStmt, doWhile.exp = exp, doWhile.stmt = statement, loc = yylloc };
1096 Statement MkForStmt(Statement init, Statement check, OldList inc, Statement statement)
1098 return { type = forStmt, forStmt.init = init, forStmt.check = check, forStmt.increment = inc, forStmt.stmt = statement, loc = yylloc };
1101 Statement MkForEachStmt(Identifier id, OldList exp, OldList filter, Statement statement)
1103 return { type = forEachStmt, forEachStmt.id = id, forEachStmt.exp = exp, forEachStmt.filter = filter, forEachStmt.stmt = statement, loc = yylloc };
1106 Statement MkGotoStmt(Identifier id)
1108 return { type = gotoStmt, gotoStmt.id = id, loc = yylloc };
1111 Statement MkContinueStmt()
1113 return { type = continueStmt, loc = yylloc };
1116 Statement MkBreakStmt()
1118 return { type = breakStmt, loc = yylloc };
1121 Statement MkReturnStmt(OldList exp)
1123 return { type = returnStmt, expressions = exp, loc = yylloc };
1126 FunctionDefinition MkFunction(OldList specifiers, Declarator declarator, OldList declarationList)
1128 return _MkFunction(specifiers, declarator, declarationList, true);
1131 FunctionDefinition _MkFunction(OldList specifiers, Declarator declarator, OldList declarationList, bool errorOnOmit)
1135 Declarator funcDecl = GetFuncDecl(declarator);
1136 if(funcDecl && funcDecl.function.parameters)
1139 for(tn = funcDecl.function.parameters->first; tn; tn = tn.next)
1141 if(tn.qualifiers || tn.declarator)
1143 Identifier declID = tn.declarator ? GetDeclId(tn.declarator) : null;
1147 Specifier spec = tn.qualifiers ? tn.qualifiers->first : null;
1148 if(!tn.declarator && !tn.prev && !tn.next && spec && !spec.next && spec.type == baseSpecifier && spec.specifier == VOID);
1150 Compiler_Error($"parameter name omitted\n");
1157 return { specifiers = specifiers, declarator = declarator, declarations = declarationList };
1160 void ProcessFunctionBody(FunctionDefinition func, Statement body)
1162 Declarator declarator = func.declarator;
1163 Declarator funcDecl = GetFuncDecl(declarator);
1168 if(funcDecl && funcDecl.function.parameters && body)
1170 Context context = body.compound.context;
1172 for(param = funcDecl.function.parameters->first; param; param = param.next)
1174 if(param.declarator)
1176 Symbol symbol = null;
1177 Identifier id = GetDeclId(param.declarator);
1178 char * string = id ? id.string : null;
1181 for(symbol = (Symbol)context.symbols.first; symbol; symbol = (Symbol)((BTNode)symbol).next)
1182 if(!strcmp(symbol.string, string))
1184 // This parameter is not shadowed by a local declaration
1187 symbol = Symbol { string = CopyString(id.string), type = ProcessType(param.qualifiers, param.declarator), isParam = true };
1188 if(!context.symbols.Add((BTNode)symbol))
1189 excludedSymbols->Add(symbol);
1191 // TODO: Fix this, the parameters' IDs should really be smaller...
1192 symbol.id = context.nextID++;
1193 param.declarator.symbol = symbol;
1200 if(!declarator.symbol)
1202 Identifier id = GetDeclId(declarator);
1204 if((currentNameSpace || defaultNameSpace) && declMode != defaultAccess && defaultDeclMode != defaultAccess && strcmp(id.string, "__on_register_module"))
1207 int len = 0, stringLen;
1208 if(defaultNameSpace)
1210 memcpy(name, defaultNameSpace, defaultNameSpaceLen);
1211 len += defaultNameSpaceLen;
1215 if(currentNameSpace)
1217 memcpy(name + len, currentNameSpace, currentNameSpaceLen);
1218 len += currentNameSpaceLen;
1222 stringLen = strlen(id.string);
1223 memcpy(name + len, id.string, stringLen);
1227 id.string = CopyString(name);
1229 symbol = Symbol { string = CopyString(id.string), type = ProcessType(func.specifiers, declarator) };
1230 symbol.idCode = symbol.id = globalContext.nextID++;
1231 if(strstr(symbol.string, "::"))
1232 globalContext.hasNameSpace = true;
1233 if(!globalContext.symbols.Add((BTNode)symbol))
1234 excludedSymbols->Add(symbol);
1235 declarator.symbol = symbol;
1239 symbol = declarator.symbol;
1240 excludedSymbols->Remove(declarator.symbol);
1241 delete symbol.string;
1242 symbol.string = CopyString(GetDeclId(declarator).string);
1243 if(strstr(symbol.string, "::"))
1244 globalContext.hasNameSpace = true;
1245 if(!globalContext.symbols.Add((BTNode)symbol))
1246 excludedSymbols->Add(symbol);
1249 symbol.type = ProcessType(func.specifiers, declarator);
1251 if(symbol.type && (symbol.type.kind == functionType || symbol.type.kind == methodType))
1253 if(!symbol.type.params.count)
1255 Type type { refCount = 1 };
1256 symbol.type.params.Add(type);
1265 External MkExternalFunction(FunctionDefinition function)
1267 External external { type = functionExternal, function = function, symbol = function.declarator.symbol };
1268 if(function.specifiers)
1271 for(spec = function.specifiers->first; spec; spec = spec.next)
1272 if(spec.type == baseSpecifier && spec.specifier == STATIC)
1274 structDeclMode = declMode = staticAccess;
1279 if(external.symbol && !external.symbol.methodExternal)
1280 external.symbol.methodExternal = external;
1284 External MkExternalImport(char * name, ImportType importType, AccessMode importAccess)
1286 External external { type = importExternal };
1287 int len = strlen(name) - 2;
1288 external.importString = new char[len + 1];
1289 strncpy(external.importString, name+1, len);
1290 external.importString[len] = '\0';
1295 Time startTime = GetTime();
1298 ImportModule(external.importString, importType, importAccess, true);
1299 ImportModule(external.importString, importType, importAccess, false);
1301 time = GetTime() - startTime;
1302 printf("Importing took %.3f seconds for %s\n", time, external.importString);
1303 externalImportTotalTime += time;
1309 External MkExternalDeclaration(Declaration declaration)
1311 External external { type = declarationExternal, declaration = declaration, symbol = declaration ? declaration.symbol : null };
1312 InitDeclarator d = (declaration && declaration.declarators) ? declaration.declarators->last : null;
1313 if(declaration && declaration.type == initDeclaration && declaration.specifiers)
1316 for(spec = declaration.specifiers->first; spec; spec = spec.next)
1317 if(spec.type == baseSpecifier && spec.specifier == TYPEDEF)
1319 structDeclMode = declMode = defaultAccess;
1322 else if(spec.type == baseSpecifier && spec.specifier == STATIC)
1324 structDeclMode = declMode = staticAccess;
1328 if(declaration && declaration.symbol && !declaration.symbol.methodExternal)
1329 declaration.symbol.methodExternal = external;
1333 External MkExternalNameSpace(Identifier identifier)
1335 External external { type = nameSpaceExternal, id = identifier };
1336 currentNameSpace = identifier ? identifier.string : null;
1337 currentNameSpaceLen = currentNameSpace ? strlen(currentNameSpace) : 0;
1341 void SetClassTemplateArgs(Specifier spec, OldList templateArgs)
1343 if(spec.type == nameSpecifier)
1345 Symbol symbol = spec.symbol;
1346 spec.templateArgs = templateArgs;
1347 if(templateArgs && templateArgs.first)
1349 char templateString[1024];
1350 TemplateArgument arg;
1351 strcpy(templateString, symbol ? symbol.string : spec.name);
1352 strcat(templateString, "<");
1353 for(arg = templateArgs.first; arg; arg = arg.next)
1361 char expString[1024];
1362 Class backupThisClass = thisClass;
1364 expString[0] = '\0';
1365 // Will this work here?
1367 Location oldLocation = yylloc;
1368 File backFileInput = fileInput;
1373 // TESTING THIS SCANNER RESUME STUFF
1376 yylloc = oldLocation;
1377 fileInput = backFileInput;
1380 fileInput.Seek(yylloc.start.pos, start);
1381 resetScannerPos(&yylloc.start);
1386 //ProcessExpressionType(arg.expression);
1387 //ComputeExpression(arg.expression);
1388 PrintExpression(arg.expression, expString);
1389 strcat(argument, expString);
1390 thisClass = backupThisClass;
1395 strcat(argument, arg.identifier.string);
1400 char * typeString = StringFromSpecDecl(arg.templateDatatype.specifiers, arg.templateDatatype.decl);
1401 strcat(argument, typeString);
1408 if(arg.prev) strcat(templateString, ", ");
1411 strcat(templateString, arg.name.string);
1412 strcat(templateString, " = ");
1414 strcat(templateString, argument);
1418 int len = strlen(templateString);
1419 if(templateString[len-1] == '>') templateString[len++] = ' ';
1420 templateString[len++] = '>';
1421 templateString[len++] = '\0';
1423 // printf("SetClassTemplateArgs templateString: %s\n", templateString);
1424 symbol = FindClass(templateString);
1425 if(!symbol && spec.symbol)
1427 // If class was only decl'ed, invoke DeclClass on this templated class as well
1428 symbol = _DeclClass(MAXINT, templateString);
1430 // Add a reference to all templated class to the basic class
1432 spec.symbol.templatedClasses.Add(OldLink { data = symbol });
1434 spec.symbol = symbol;
1435 spec.name = CopyString(symbol ? symbol.string : templateString);
1439 FreeList(templateArgs, FreeTemplateArgument);
1442 Specifier _MkSpecifierName(char * name, Symbol symbol, OldList templateArgs)
1444 Specifier spec { type = nameSpecifier };
1450 TemplatedType templatedType = FindTemplateTypeParameter(curContext, name);
1453 spec.templateParameter = templatedType.param;
1454 spec.type = templateTypeSpecifier;
1458 symbol = FindClass(name);
1460 if(symbol && symbol.registered && symbol.registered.isRemote == 1)
1462 char className[1024];
1463 strcpy(className, "DCOMClient_");
1464 if(!strncmp(name, className, strlen(className)))
1465 spec.name = CopyString(name);
1468 strcat(className, name);
1469 spec.name = CopyString(className);
1473 spec.name = CopyString(symbol.string);
1475 spec.name = CopyString(name);
1476 spec.symbol = symbol;
1477 if(templateArgs != null)
1478 SetClassTemplateArgs(spec, templateArgs);
1483 public Specifier MkSpecifierName(char * name)
1485 return _MkSpecifierName(name, null, null);
1488 public Specifier MkSpecifierNameArgs(char * name, OldList * templateArgs)
1490 return _MkSpecifierName(name, null, templateArgs);
1494 Specifier MkClassName(char * string)
1496 return { type = SpecifierClass, name = CopyString(string) };
1499 ClassFunction MkClassFunction(OldList specifiers, Specifier _class, Declarator decl, OldList declList)
1501 return { specifiers = specifiers, /*_class = _class,*/ declarator = decl, declarations = declList };
1504 void ProcessClassFunctionBody(ClassFunction func, Statement body)
1508 Declarator decl = func.declarator;
1510 //Declarator decl = GetFuncDecl(func.declarator);
1511 Declarator funcDecl = GetFuncDecl(func.declarator);
1515 if(decl && !decl.symbol)
1517 OldList * symbolSpecs = MkList();
1519 // WHAT WILL WE DO WITH THIS? Double instances?
1520 //if(decl.function.parameters && body)
1521 if(funcDecl && funcDecl.function.parameters && body)
1523 Context context = body.compound.context;
1525 for(param = funcDecl.function.parameters->first; param; param = param.next)
1527 if(param.declarator)
1529 Symbol symbol = null;
1530 Identifier id = GetDeclId(param.declarator);
1531 char * string = id ? id.string : null;
1534 symbol = (Symbol)context.symbols.FindString(string);
1536 // This parameter is not shadowed by a local declaration
1541 string = CopyString(id.string);
1542 type = ProcessType(param.qualifiers, param.declarator);
1546 // TODO: Fix this, the parameters' IDs should really be smaller...
1547 symbol.idCode = symbol.id = context.nextID++;
1548 if(!context.symbols.Add((BTNode)symbol))
1549 excludedSymbols->Add(symbol);
1551 param.declarator.symbol = symbol;
1556 //////////////////////////////////
1564 Identifier id = GetDeclId(funcDecl);
1568 for(c = strlen(id.string)-1; c >= 0; c--)
1570 if(id.string[c] == ':')
1572 char * string = CopyString(id.string + c + 1);
1573 id.string[c - 1] = 0;
1574 id._class = MkSpecifierName(id.string);
1580 symbol.string = CopyString(id.string);
1587 for(spec = func.specifiers->first; spec; spec = spec.next)
1588 symbolSpecs->Add(CopySpecifier(spec));
1590 symbol.type = ProcessType(symbolSpecs, decl);
1591 symbol.idCode = symbol.id = globalContext.nextID++;
1592 decl.symbol = symbol;
1594 excludedSymbols->Add(symbol);
1596 FreeList(symbolSpecs, FreeSpecifier);
1600 OldList * MkSpecsClass(Specifier _class)
1602 OldList * list = MkList();
1603 ListAdd(list, _class);
1607 MemberInit MkMemberInit(OldList ids, Initializer initializer)
1609 return { identifiers = ids, initializer = initializer };
1612 MemberInit MkMemberInitExp(Expression idExp, Initializer initializer)
1614 MemberInit init { initializer = initializer, identifiers = MkList() };
1617 for(exp = idExp; exp && exp.type == memberExp; exp = exp.member.exp)
1619 init.identifiers->Insert(null, exp.member.member);
1620 exp.member.member = null;
1622 if(exp && exp.type == identifierExp)
1624 init.identifiers->Insert(null, exp.identifier);
1625 exp.identifier = null;
1627 FreeExpression(idExp);
1631 MembersInit MkMembersInitList(OldList dataMembers)
1633 return { type = dataMembersInit, dataMembers = dataMembers };
1636 MembersInit MkMembersInitMethod(ClassFunction function)
1638 return { type = methodMembersInit, function = function };
1641 Instantiation MkInstantiation(Specifier _class, Expression exp, OldList members)
1643 return { _class = _class, exp = exp, members = members };
1646 Instantiation MkInstantiationNamed(OldList specs, Expression exp, OldList members)
1648 Instantiation inst { exp = exp, members = members };
1653 for(spec = specs.first; spec; spec = spec.next)
1654 if(spec.type == nameSpecifier /*classSpecifier*/)
1661 FreeList(specs, FreeSpecifier);
1665 Compiler_Error($"Expecting class specifier\n");
1666 inst._class = MkSpecifierName /*MkClassName*/("");
1674 ClassDef MkClassDefAccessOverride(AccessMode access, Identifier id)
1676 return { type = accessOverrideClassDef, id = id, memberAccess = access };
1679 ClassDef MkClassDefMemberAccess()
1681 return { type = memberAccessClassDef };
1684 ClassDef MkClassDefDeclaration(Declaration decl)
1686 return { type = declarationClassDef, decl = decl };
1689 ClassDef MkClassDefClassData(Declaration decl)
1691 return { type = classDataClassDef, decl = decl };
1694 ClassDef MkClassDefDesigner(char * designer)
1696 return { type = classDesignerClassDef, designer = CopyString(designer) };
1699 ClassDef MkClassDefNoExpansion()
1701 return { type = classNoExpansionClassDef };
1704 ClassDef MkClassDefFixed()
1706 return { type = classFixedClassDef };
1709 ClassDef MkClassDefDesignerDefaultProperty(Identifier id)
1711 return { type = designerDefaultPropertyClassDef, defaultProperty = id };
1714 ClassDef MkClassDefDefaultProperty(OldList defProperties)
1716 return { type = defaultPropertiesClassDef, defProperties = defProperties };
1719 ClassDef MkClassDefFunction(ClassFunction function)
1722 if(function && function.declarator)
1724 Declarator funcDecl = GetFuncDecl(function.declarator);
1725 if(funcDecl && funcDecl.declarator && funcDecl.declarator.type == bracketsDeclarator)
1727 def.type = declarationClassDef;
1728 def.decl = MkStructDeclaration(function.specifiers, MkListOne(MkStructDeclarator(function.declarator, null)), null);
1729 function.declarator = null;
1730 function.specifiers = null;
1731 FreeClassFunction(function);
1735 def.type = functionClassDef;
1736 def.function = function;
1740 Symbol DeclClassAddNameSpace(int symbolID, char * className)
1743 int len = 0, stringLen;
1745 if((currentNameSpace || defaultNameSpace) && declMode != defaultAccess && defaultDeclMode != defaultAccess)
1747 if(defaultNameSpace)
1749 memcpy(name, defaultNameSpace, defaultNameSpaceLen);
1750 len += defaultNameSpaceLen;
1754 if(currentNameSpace)
1756 memcpy(name + len, currentNameSpace, currentNameSpaceLen);
1757 len += currentNameSpaceLen;
1762 stringLen = strlen(className);
1763 memcpy(name + len, className, stringLen);
1766 return _DeclClass(symbolID, name);
1769 Symbol DeclClass(int symbolID, char * name)
1771 if(strchr(name, ':'))
1772 return _DeclClass(symbolID, name);
1774 return DeclClassAddNameSpace(symbolID, name);
1777 Symbol _DeclClass(int symbolID, char * name)
1779 Symbol symbol = FindClass(name);
1783 Context classContext;
1784 for(classContext = curContext; classContext && !classContext.classDef; classContext = classContext.parent);
1790 if(name[0] == ':' && name[1] == ':')
1794 string = CopyString(name);
1795 idCode = symbolID, id = symbolID;
1797 if(!globalContext.classes.Add((BTNode)symbol))
1798 excludedSymbols->Add(symbol);
1803 for(c = 0; (ch = name[c]); c++)
1805 if(ch == '.' || (ch == ':' && name[c+1] == ':'))
1811 if(start && c - start)
1812 symbol.shortName = CopyString(name + start);
1816 symbol.idCode = symbol.id = symbolID;
1820 void SetupBaseSpecs(Symbol symbol, OldList baseSpecs)
1822 if(baseSpecs && baseSpecs.first && ((Specifier)baseSpecs.first).type == nameSpecifier)
1827 strcpy(name, ((Specifier)baseSpecs.first).name);
1828 tpl = strchr(name, '<');
1831 baseClass = FindClass(name);
1832 if(baseClass && baseClass.ctx)
1835 for(copy = (TemplatedType)baseClass.ctx.templateTypes.first; copy; copy = (TemplatedType)copy.next)
1837 TemplatedType type { key = copy.key, param = copy.param };
1838 if(!curContext.templateTypes.Add((BTNode)type))
1842 else if(baseClass && baseClass.registered)
1845 for(sClass = baseClass.registered; sClass; sClass = sClass.base)
1847 ClassTemplateParameter p;
1848 for(p = sClass.templateParams.first; p; p = p.next)
1850 //OldList * specs = MkList();
1851 //Declarator decl = null;
1852 //decl = SpecDeclFromString(p.dataTypeString, specs, null);
1855 TemplateParameter param = p.param;
1859 p.param = param = TemplateParameter
1861 identifier = MkIdentifier(p.name), type = p.type,
1862 dataTypeString = p.dataTypeString /*, dataType = { specs, decl }*/
1865 type = TemplatedType { key = (uintptr)p.name, param = param };
1866 if(!curContext.templateTypes.Add((BTNode)type))
1875 ClassDefinition MkClass(Symbol symbol, OldList baseSpecs, OldList definitions)
1877 ClassDefinition classDef;
1878 SetupBaseSpecs(symbol, baseSpecs);
1881 ClassDefinition classDef = symbol.ctx.classDef;
1884 // This can occur if two instances of a class are defined...
1885 // To avoid dangling 'parent' Contexts, we free the previous class definition
1887 for(external = ast->first; external; external = external.next)
1889 if(external.type == classExternal && external._class == classDef)
1891 ast->Remove(external);
1892 FreeExternal(external);
1897 FreeContext(symbol.ctx);
1900 symbol.ctx = curContext;
1901 classDef = { symbol = symbol, _class = MkSpecifierName /*MkClassName*/(symbol.string), baseSpecs = baseSpecs, definitions = definitions, nameLoc = symbol.nameLoc };
1902 curContext.classDef = classDef;
1906 Expression MkExpInstance(Instantiation inst)
1908 return { type = instanceExp, instance = inst };
1911 External MkExternalClass(ClassDefinition _class)
1913 return { type = classExternal, _class = _class, symbol = _class.symbol };
1916 PropertyDef MkProperty(OldList specs, Declarator decl, Identifier id, Statement setStmt, Statement getStmt)
1926 Type type = ProcessType(specs, decl);
1929 char typeString[1024];
1930 typeString[0] = '\0';
1931 PrintTypeNoConst(type, typeString, false, true);
1932 id = MkIdentifier(typeString);
1933 prop.conversion = true;
1939 string = CopyString(id.string);
1942 symbol.idCode = symbol.id = globalContext.nextID++;
1943 excludedSymbols->Add(symbol);
1944 globalContext.nextID++;
1945 globalContext.nextID++;
1946 prop.symbol = symbol;
1950 ClassDef MkClassDefProperty(PropertyDef propertyDef)
1952 return { type = propertyClassDef, propertyDef = propertyDef };
1955 ClassDef MkClassDefClassProperty(PropertyDef propertyDef)
1957 return { type = classPropertyClassDef, propertyDef = propertyDef };
1960 ClassDef MkClassDefClassPropertyValue(Identifier id, Initializer initializer)
1962 return { type = classPropertyValueClassDef, id = id, initializer = initializer };
1965 int CheckType(char * text)
1968 Time startTime = GetTime();
1970 if(FindTemplateTypeParameter(curContext, text))
1973 checkTypeTotalTime += GetTime() - startTime;
1977 if(FindType(curContext, text))
1980 checkTypeTotalTime += GetTime() - startTime;
1987 checkTypeTotalTime += GetTime() - startTime;
1989 return TYPE_NAME; //CLASS_NAME;
1992 checkTypeTotalTime += GetTime() - startTime;
1999 return CheckType(yytext);
2002 Context PushContext()
2004 Context ctx { parent = curContext };
2009 void PopContext(Context ctx)
2011 curContext = ctx.parent;
2014 Symbol FindType(Context ctx, char * name)
2019 //char output[8192];
2020 type = (Symbol)ctx.types.FindString(name);
2021 /*if(!strcmp(name, "intptr_t") && !type)
2023 ctx.types.Print(output, depthOrder);
2026 if(!type && ctx.parent)
2027 type = FindType(ctx.parent, name);
2032 TemplatedType FindTemplateTypeParameter(Context ctx, char * name)
2034 TemplatedType templatedType = null;
2037 templatedType = (TemplatedType)ctx.templateTypes.FindString(name);
2038 if(!templatedType && ctx.parent)
2039 templatedType = FindTemplateTypeParameter(ctx.parent, name);
2041 return templatedType;
2044 bool ModuleAccess(Module searchIn, Module searchFor)
2046 SubModule subModule;
2048 if(searchFor == searchIn)
2051 for(subModule = searchIn.modules.first; subModule; subModule = subModule.next)
2053 if(subModule.importMode == publicAccess /*|| searchIn == searchIn.application*/)
2055 if(ModuleAccess(subModule.module, searchFor))
2062 ModuleImport FindModule(Module moduleToFind)
2064 ModuleImport module;
2065 if(!moduleToFind.name)
2067 for(module = imports->first; module; module = module.next)
2068 if(module.name && !strcmp(module.name, moduleToFind.name))
2072 module = ModuleImport
2074 name = CopyString(moduleToFind.name), importType = moduleToFind.importType,
2075 importAccess = ModuleAccess(privateModule, moduleToFind) ? publicAccess : privateAccess
2077 imports->Add(module);
2083 // TO REMOVE: OBSOLETE...
2084 static void GetFullClassNameSpace(NameSpace * ns, char * name)
2088 GetFullClassNameSpace(ns->parent, name);
2089 strcat(name, ns->name);
2094 static char * GetFullClassName(Class c, char * name)
2096 NameSpace * nameSpace;
2098 GetFullClassNameSpace(c.nameSpace, name);
2099 strcat(name, c.name);
2104 public Symbol FindClass(char * name)
2107 Time startTime = GetTime();
2111 bool global = false;
2112 char fullName[1024];
2114 if(name[0] == ':' && name[1] == ':')
2120 if(!global && (currentNameSpace || defaultNameSpace) && declMode != defaultAccess && defaultDeclMode != defaultAccess)
2122 int len = 0, stringLen;
2123 if(defaultNameSpace)
2125 memcpy(fullName, defaultNameSpace, defaultNameSpaceLen);
2126 len += defaultNameSpaceLen;
2127 fullName[len++] = ':';
2128 fullName[len++] = ':';
2130 if(currentNameSpace)
2132 memcpy(fullName + len, currentNameSpace, currentNameSpaceLen);
2133 len += currentNameSpaceLen;
2134 fullName[len++] = ':';
2135 fullName[len++] = ':';
2137 stringLen = strlen(name);
2138 memcpy(fullName + len, name, stringLen);
2141 cl = globalContext ? (Symbol)globalContext.classes.FindString(fullName) : null;
2145 cl = globalContext ? (Symbol)globalContext.classes.FindString(name) : null;
2150 Time startTime = GetTime();
2152 // Ignore name space name when searching
2153 for(cl = globalContext ? (Symbol)globalContext.classes.first : null; cl; cl = (Symbol)((BTNode)cl).next)
2157 char * string = cl.string;
2159 for(c = 0; (ch = string[c]); c++)
2161 if(ch == '.' || (ch == ':' && string[c+1] == ':'))
2167 if(start && c - start)
2169 if(!strcmp(string + start, name))
2173 if(cl.shortName && !strcmp(cl.shortName, name))
2177 findClassIgnoreNSTotalTime += GetTime() - startTime;
2183 if(!global && (currentNameSpace || defaultNameSpace) && declMode != defaultAccess && defaultDeclMode != defaultAccess)
2184 _class = eSystem_FindClass(privateModule, fullName);
2186 _class = eSystem_FindClass(privateModule, name);
2190 name = _class.fullName;
2192 cl = (Symbol)globalContext.classes.FindString(name);
2197 string = CopyString(name);
2198 registered = _class;
2205 cl.module = FindModule(_class.module);
2207 cl.module = mainModule;
2208 if(!globalContext.classes.Add((BTNode)cl))
2209 excludedSymbols->Add(cl);
2210 if(strcmp(name, _class.name))
2211 cl.shortName = CopyString(_class.name);
2216 findClassTotalTime += GetTime() - startTime;
2221 void CopyTypeInto(Type type, Type src)
2224 type.name = CopyString(src.name);
2227 if(src.kind == enumType)
2231 type.members.Clear();
2232 // This must have been a mistake: member = **type**.members.first
2233 for(member = src.members.first; member; member = member.next)
2235 type.members.Add(NamedLink { name = CopyString(member.name), data = member.data });
2237 type.enumName = CopyString(src.enumName);
2239 else if(src.kind == structType || src.kind == unionType)
2242 // Tricky stuff... will be removed from list only when ref count reaches 0
2243 for(member = type.members.first; member; member = member.next)
2245 type.enumName = CopyString(src.enumName);
2247 else if(src.kind == functionType)
2250 type.returnType.refCount++;
2251 for(param = type.params.first; param; param = param.next)
2254 else if(src.kind == pointerType || src.kind == arrayType)
2256 type.type.refCount++;
2257 if(src.kind == arrayType)
2259 if(type.arraySizeExp)
2260 type.arraySizeExp = CopyExpression(type.arraySizeExp);
2266 static Type ProcessTypeSpecs(OldList specs, bool assumeEllipsis, bool keepTypeName)
2268 Type specType { refCount = 1, kind = intType, isSigned = true };
2271 bool isTypedef = false;
2273 bool isLong = false;
2274 for(spec = specs.first; spec; spec = spec.next)
2276 if(spec.type == extendedSpecifier)
2278 ExtDecl extDecl = spec.extDecl;
2279 if(extDecl.type == extDeclString)
2281 String s = spec.extDecl.s;
2282 if(!strcmp(spec.extDecl.s, "__declspec(dllexport)") || !strcmp(spec.extDecl.s, "dllexport"))
2283 specType.dllExport = true;
2284 else if(!strcmp(spec.extDecl.s, "__declspec(stdcall)") || !strcmp(spec.extDecl.s, "stdcall"))
2285 specType.attrStdcall = true;
2287 else if(extDecl.type == extDeclAttrib)
2289 OldList * attribs = extDecl.attr.attribs;
2293 for(attr = attribs->first; attr; attr = attr.next)
2295 String s = attr.attr;
2298 if(!strcmp(s, "dllexport"))
2299 specType.dllExport = true;
2300 else if(!strcmp(s, "stdcall"))
2301 specType.attrStdcall = true;
2305 specType.keepCast = true;
2309 if(spec.specifier != CONST && (specType.kind == structType || specType.kind == unionType))
2312 specType = { kind = intType, isSigned = true, refCount = 1 };
2315 if(isTypedef && keepTypeName)
2317 specType.kind = dummyType;
2320 else if(spec.type == baseSpecifier)
2322 if(spec.specifier == TYPEDEF)
2324 else if(spec.specifier == VOID) specType.kind = voidType;
2325 else if(spec.specifier == CHAR) specType.kind = charType;
2326 else if(spec.specifier == INT) { if(specType.kind != shortType && specType.kind != longType && !isLong) specType.kind = intType; }
2327 else if(spec.specifier == _BOOL || spec.specifier == BOOL)
2328 specType.kind = _BoolType;
2329 else if(spec.specifier == UINT) { if(specType.kind != shortType && specType.kind != longType) specType.kind = intType; specType.isSigned = false; }
2330 else if(spec.specifier == INT64) specType.kind = int64Type;
2331 else if(spec.specifier == VALIST)
2332 specType.kind = vaListType;
2333 else if(spec.specifier == SHORT) specType.kind = shortType;
2334 else if(spec.specifier == LONG)
2336 if(isLong || (targetBits == 64 && targetPlatform != win32))
2337 specType.kind = int64Type;
2339 specType.kind = intType;
2342 else if(spec.specifier == FLOAT) specType.kind = floatType;
2343 else if(spec.specifier == DOUBLE) specType.kind = doubleType;
2344 else if(spec.specifier == SIGNED) specType.isSigned = true;
2345 else if(spec.specifier == UNSIGNED) specType.isSigned = false;
2346 else if(spec.specifier == CONST)
2347 specType.constant = true;
2348 else if(spec.specifier == TYPED_OBJECT || spec.specifier == ANY_OBJECT || spec.specifier == CLASS)
2350 switch(spec.specifier)
2352 case TYPED_OBJECT: specType.classObjectType = typedObject; break;
2353 case ANY_OBJECT: specType.classObjectType = anyObject; break;
2354 case CLASS: specType.classObjectType = classPointer; break;
2356 specType.kind = classType;
2357 specType._class = FindClass("class");
2359 else if(spec.specifier == THISCLASS)
2360 specType.kind = thisClassType;
2362 else if(spec.type == nameSpecifier)
2364 if(spec.name && (!strcmp(spec.name, "intptr") || !strcmp(spec.name, "uintptr")))
2366 specType.kind = intPtrType;
2367 if(!strcmp(spec.name, "uintptr"))
2368 specType.isSigned = false;
2370 else if(spec.name && (!strcmp(spec.name, "uintsize") || !strcmp(spec.name, "intsize")))
2372 specType.kind = intSizeType;
2373 if(!strcmp(spec.name, "uintsize"))
2374 specType.isSigned = false;
2378 Symbol symbol = spec.name ? FindType(curContext, spec.name) : null;
2379 if(symbol && symbol.type)
2381 // Free Type Contents:
2386 CopyTypeInto(specType, symbol.type);
2387 specType.typeName = CopyString(symbol.type.name);
2389 else if(!isTypedef) // !specType.kind) // TESTING THIS FOR enum / typedef problem
2391 // key.sym enum values need FindClass:
2392 specType._class = spec.name ? FindClass(spec.name) : null;
2393 specType.kind = classType;
2394 if(!specType._class)
2395 specType.kind = intType;
2399 else if(spec.type == enumSpecifier)
2401 specType.kind = enumType;
2402 specType.enumName = spec.id ? CopyString(spec.id.string) : null;
2408 for(e = spec.list->first; e; e = e.next)
2410 NamedLink i { name = CopyString(e.id.string) };
2411 specType.members.Add(i);
2415 else if(spec.type == templateTypeSpecifier)
2417 specType.kind = templateType;
2418 specType.templateParameter = spec.templateParameter;
2420 else if(spec.type == structSpecifier || spec.type == unionSpecifier)
2422 Symbol _class = spec.id ? FindClass(spec.id.string) : null;
2425 specType.declaredWithStruct = true;
2426 if(!_class.registered || _class.registered.type != structClass)
2427 specType.directClassAccess = true; // TODO: Need to clarify what 'directClassAccess' is about
2428 specType._class = _class;
2429 specType.kind = classType;
2432 specType.members.Clear();
2433 if(spec.type == structSpecifier)
2434 specType.kind = structType;
2435 else if(spec.type == unionSpecifier)
2436 specType.kind = unionType;
2439 // TESTING THIS HERE... Had 0 type size
2440 if(!spec.definitions && !isTypedef)
2442 Symbol symbol = spec.id.string ? FindSymbol(spec.id.string, curContext, globalContext, true, false) : null;
2443 if(symbol && symbol.type)
2445 specType = *symbol.type;
2446 specType.name = CopyString(symbol.type.name);
2447 specType.typeName = CopyString(spec.name);
2448 specType.enumName = CopyString(symbol.type.enumName);
2449 specType.refCount = 1;
2451 if(symbol.type.kind == enumType)
2455 specType.members.Clear();
2456 for(member = symbol.type.members.first; member; member = member.next)
2458 NamedLink item { name = CopyString(member.name), data = member.data };
2459 specType.members.Add(item);
2462 else if(symbol.type.kind == structType || symbol.type.kind == unionType)
2465 // Tricky stuff... will be removed from list only when ref count reaches 0
2466 for(member = specType.members.first; member; member = member.next)
2469 else if(symbol.type.kind == functionType)
2472 specType.returnType.refCount++;
2473 for(param = specType.params.first; param; param = param.next)
2476 else if(symbol.type.kind == pointerType || symbol.type.kind == arrayType)
2478 specType.type.refCount++;
2479 if(symbol.type.kind == arrayType)
2481 if(specType.arraySizeExp)
2482 specType.arraySizeExp = CopyExpression(specType.arraySizeExp);
2488 specType.enumName = CopyString(spec.id.string);
2491 specType.enumName = CopyString(spec.id.string);
2494 if(spec.definitions)
2497 for(def = spec.definitions->first; def; def = def.next)
2499 if(def.type == declarationClassDef && def.decl.type == structDeclaration)
2501 Declaration decl = def.decl;
2502 if(decl.declarators)
2505 for(d = decl.declarators->first; d; d = d.next)
2507 Type memberType = ProcessType(decl.specifiers, d);
2508 specType.members.Add(memberType);
2511 else if(decl.specifiers)
2513 Type memberType = ProcessType(decl.specifiers, null);
2514 specType.members.Add(memberType);
2521 else if(spec.type == subClassSpecifier)
2523 specType.kind = specType.kind = subClassType;
2524 specType._class = spec._class.symbol;
2528 else if(assumeEllipsis)
2529 specType.kind = ellipsisType;
2533 static Type ProcessTypeDecls(OldList specs, Declarator decl, Type parentType)
2535 Type type = parentType;
2536 Declarator subDecl = decl ? decl.declarator : null;
2538 type = ProcessTypeSpecs(specs, decl == null, (decl && decl.type == extendedDeclaratorEnd) ? true : false);
2543 case bracketsDeclarator: break;
2544 case extendedDeclarator:
2545 case extendedDeclaratorEnd:
2547 ExtDecl extDecl = decl.extended.extended;
2550 switch(extDecl.type)
2554 String s = extDecl.s;
2557 if(!strcmp(s, "__declspec(dllexport)") || !strcmp(s, "dllexport"))
2558 type.dllExport = true;
2559 else if(!strcmp(s, "__declspec(stdcall)") || !strcmp(s, "stdcall"))
2560 type.attrStdcall = true;
2566 OldList * attribs = extDecl.attr.attribs;
2570 for(attr = attribs->first; attr; attr = attr.next)
2572 String s = attr.attr;
2575 if(!strcmp(s, "dllexport"))
2576 type.dllExport = true;
2577 else if(!strcmp(s, "stdcall"))
2578 type.attrStdcall = true;
2582 type.keepCast = true;
2589 case structDeclarator:
2591 Expression exp = decl.structDecl.exp;
2594 ProcessExpressionType(exp);
2595 ComputeExpression(exp);
2596 if(exp.type == constantExp)
2597 type.bitFieldCount = (uint)strtoul(exp.constant, null, 0);
2601 case functionDeclarator:
2603 type = { refCount = 1, kind = functionType, returnType = type, dllExport = type.dllExport, attrStdcall = type.attrStdcall };
2604 if(decl.function.parameters)
2607 for(param = decl.function.parameters->first; param; param = param.next)
2608 type.params.Add(ProcessType(param.qualifiers, param.declarator));
2612 case arrayDeclarator:
2614 type = { refCount = 1, kind = arrayType, arraySizeExp = CopyExpression(decl.array.exp), freeExp = true, type = type, dllExport = type.dllExport, attrStdcall = type.attrStdcall };
2615 if(decl.array.enumClass)
2616 type.enumClass = decl.array.enumClass.symbol;
2619 case pointerDeclarator:
2621 Pointer pointer = decl.pointer.pointer;
2624 OldList * qualifiers = pointer.qualifiers;
2625 if(type.classObjectType)
2626 type.byReference = true;
2628 type = { refCount = 1, kind = pointerType, type = type, dllExport = type.dllExport, attrStdcall = type.attrStdcall };
2632 for(spec = qualifiers->first; spec; spec = spec.next)
2634 if(spec.type == baseSpecifier && spec.specifier == CONST)
2635 type.constant = true;
2638 pointer = pointer.pointer;
2642 case identifierDeclarator:
2644 Identifier id = decl.identifier;
2645 Specifier _class = id._class;
2647 type.name = CopyString(id.string);
2650 if(_class.type == templateTypeSpecifier)
2652 type.thisClassTemplate = _class.templateParameter;
2653 type.extraParam = true;
2657 String name = _class.name;
2659 type.staticMethod = true;
2663 id.classSym = _class.symbol; // FindClass(_class.name);
2664 /* TODO: Name Space Fix ups
2665 id.nameSpace = eSystem_FindNameSpace(privateModule, _class.name);
2668 if(name[strlen(name)-1] == '&')
2670 type.thisClass = FindClass("class");
2671 type.byReference = true;
2674 type.thisClass = _class.symbol;
2676 if(type.thisClass && strcmp(type.thisClass.string, "class"))
2677 type.extraParam = true;
2678 else if(!strcmp(name, "any_object"))
2680 type.extraParam = true;
2681 type.thisClass = FindClass("class");
2683 else if(!strcmp(name, "class"))
2685 type.thisClass = FindClass("class");
2686 type.classObjectType = classPointer; // This is used for class properties
2688 else if(!strcmp(name, "typed_object") || !strcmp(name, "typed_object&"))
2690 type.thisClass = FindClass("class");
2691 type.classObjectType = typedObject;
2699 PrintLn("Unhandled Declarator Type: ", decl.type);
2704 Type curType = type;
2705 type = ProcessTypeDecls(null, subDecl, type);
2706 if(curType && type.kind != functionType)
2708 curType.thisClassTemplate = type.thisClassTemplate;
2709 curType.extraParam = type.extraParam;
2710 curType.staticMethod = type.staticMethod;
2711 curType.thisClass = type.thisClass;
2712 curType.byReference = type.byReference;
2713 curType.classObjectType = type.classObjectType;
2719 public Type ProcessType(OldList specs, Declarator decl)
2721 return ProcessTypeDecls(specs, decl, null);
2724 public Type ProcessTypeString(char * string, bool staticMethod)
2726 OldList * specs = MkList();
2727 Declarator decl = SpecDeclFromString(string, specs, null);
2728 Type type = ProcessType(specs, decl);
2729 if(type && !type.thisClass && staticMethod) type.staticMethod = true;
2730 FreeList(specs, FreeSpecifier);
2731 if(decl) FreeDeclarator(decl);
2735 Type MkClassTypeSymbol(Symbol symbol)
2739 Type type { kind = classType, _class = symbol };
2742 // Defaults to an int instead...
2743 type.kind = intType;
2751 public Type MkClassType(char * name)
2755 Type type { kind = classType, _class = FindClass(name) };
2758 // Defaults to an int instead...
2759 type.kind = intType;
2767 AsmField MkAsmField(char * command, Expression expression, Identifier symbolic)
2769 return { command = command, expression = expression, symbolic = symbolic };
2772 Statement MkAsmStmt(Specifier spec, char * statements, OldList inputFields, OldList outputFields, OldList clobberedFields)
2774 return { type = asmStmt, asmStmt.spec = spec, asmStmt.statements = statements,
2775 asmStmt.inputFields = inputFields, asmStmt.outputFields = outputFields,
2776 asmStmt.clobberedFields = clobberedFields };
2779 ClassDef MkClassDefPropertyWatch(PropertyWatch watcher)
2781 return { type = propertyWatchClassDef, propertyWatch = watcher };
2784 Statement MkFireWatchersStmt(Expression object, OldList watches)
2786 return { type = fireWatchersStmt, _watch.object = object, _watch.watches = watches };
2789 Statement MkStopWatchingStmt(Expression watcher, Expression object, OldList watches)
2791 return { type = stopWatchingStmt, _watch.watcher = watcher, _watch.object = object, _watch.watches = watches };
2794 Statement MkWatchStmt(Expression watcher, Expression object, OldList watches)
2796 return { type = watchStmt, _watch.watcher = watcher, _watch.object = object, _watch.watches = watches };
2799 PropertyWatch MkDeleteWatch(Statement compound)
2801 return { compound = compound, deleteWatch = true };
2804 PropertyWatch MkPropertyWatch(OldList properties, Statement compound)
2806 return { compound = compound, properties = properties };
2809 Expression MkExpClass(OldList * specifiers, Declarator decl)
2811 return { type = classExp, _classExp.specifiers = specifiers, _classExp.decl = decl };
2814 Expression MkExpClassData(Identifier id)
2816 return { type = classDataExp, classData.id = id };
2820 External MkExternalDBTable(DBTableDef table)
2822 return { type = dbtableExternal, table = table };
2825 DBTableDef MkDBTableDef(char * name, Symbol symbol, OldList * definitions)
2827 return { name = name, symbol = symbol, definitions = definitions };
2830 DBTableEntry MkDBFieldEntry(TypeName type, Identifier id, char * name)
2832 return { type = fieldEntry, dataType = type, id = id, name = name };
2835 DBIndexItem MkDBIndexItem(Identifier id, Order order)
2837 return { id = id, order = order };
2840 DBTableEntry MkDBIndexEntry(OldList * items, Identifier id)
2842 return { type = indexEntry, items = items, id = id };
2845 Expression MkExpDBOpen(Expression ds, Expression dbName)
2847 return { type = dbopenExp, dbopen.ds = ds, dbopen.name = dbName };
2850 Expression MkExpDBField(char * table, Identifier id)
2852 return { type = dbfieldExp, db.table = table, db.id = id };
2855 Expression MkExpDBIndex(char * table, Identifier id)
2857 return { type = dbindexExp, db.table = table, db.id = id };
2860 Expression MkExpDBTable(char * table)
2862 return { type = dbtableExp, db.table = table };
2865 Expression MkExpArray(OldList * expressions)
2867 return { type = arrayExp, list = expressions };
2870 Expression GetTemplateArgExpByName(char * paramName, Class curClass, TemplateParameterType tplType)
2872 Expression argExp = null;
2873 Class _class = curClass ? curClass : ((curExternal && curExternal.type == functionExternal && curExternal.function) ? curExternal.function._class : null);
2877 ClassTemplateParameter curParam;
2879 for(sClass = _class; sClass; sClass = sClass.base)
2882 for(curParam = sClass.templateParams.first; curParam; curParam = curParam.next)
2884 if(!strcmp(curParam.name, paramName))
2886 for(sClass = sClass.base; sClass; sClass = sClass.base)
2887 id += sClass.templateParams.count;
2895 if(curParam && curParam.type != tplType)
2901 char className[1024];
2902 Expression classExp;
2904 sprintf(idString, "%d", id);
2905 strcpy(className, "__ecereClass_");
2906 FullClassNameCat(className, _class.fullName, true);
2907 MangleClassName(className);
2908 DeclareClass(FindClass(_class.fullName), className);
2910 argExp = MkExpIndex((/*pointer ? MkExpPointer : */MkExpMember)
2911 (MkExpMember(MkExpIdentifier(MkIdentifier("this")), MkIdentifier("_class")) /*MkExpIdentifier(MkIdentifier(className))*/,
2912 MkIdentifier("templateArgs")), MkListOne(MkExpConstant(idString)));
2918 Expression GetTemplateArgExp(TemplateParameter param, Class curClass, bool pointer)
2920 return param.identifier ? GetTemplateArgExpByName(param.identifier.string, curClass, type) : null;
2923 /*char * CreateMsgID(char * string, char * context)
2925 int lenString = strlen(string), lenContext = strlen(context);
2926 char * msgid = new char[lenString + lenContext + 20];
2927 memcpy(msgid, string, lenString);
2928 memcpy(msgid+lenString, " [msgctxt: ", 11);
2929 memcpy(msgid+lenString+11, context, lenContext);
2930 memcpy(msgid+lenString+11+lenContext, "]", 2);
2934 public void OutputIntlStrings()
2936 if(intlStrings.count)
2938 char * srcFile = GetSourceFile();
2939 char * objFile = GetOutputFile();
2940 char srcFileFixed[MAX_LOCATION];
2941 char potFile[MAX_LOCATION];
2943 ChangeExtension(objFile, "bowl", potFile);
2944 f = FileOpen(potFile, write);
2947 char * filePrefix = "";
2948 if(!(srcFile[0] && (srcFile[1] == ':' || srcFile[0] == '/')))
2949 filePrefix = "./"; //(GetRuntimePlatform() == win32) ? ".\\" : "./";
2950 // GetSystemPathBuffer(srcFileFixed, srcFile);
2951 GetSlashPathBuffer(srcFileFixed, srcFile);
2952 for(s : intlStrings)
2954 // TOFIX: (#654) ContextStringPair * pair = &s;
2955 ContextStringPair pair = &s;
2957 f.Printf("#: %s%s:%d\n", filePrefix, srcFileFixed, l.start.line);
2958 // PoEdit now preserves and distinguish msgctxt
2960 f.Printf("msgctxt \"%s\"\n", pair.context);
2961 f.Printf("msgid \"%s\"\n", pair.string);
2962 f.Printf("msgstr \"%s\"\n\n", pair.string);
2970 default extern OldList * ast;
2971 default extern int yyparse ();
2972 default extern int yylex ();
2974 public void SetAST(OldList * list) { ast = list; }
2975 public OldList * GetAST() { return ast; }
2976 public void ParseEc()
2986 public const char * GetYYText()