public List <object> GetLocalListOfObjects() { List <object> res = new List <object>(); foreach (E declaration in this) { if (declaration is EnumerationType) { EnumerationType type = declaration as EnumerationType; res.Add(type); //TODO: support overloading foreach (EnumerationLiteral literal in type.Literals) { res.Add(literal); } } else if (declaration is RecordType) { RecordType type = declaration as RecordType; res.Add(type); foreach (VHDL.type.RecordType.ElementDeclaration el in type.Elements) { foreach (string name in el.Identifiers) { res.Add(name); } } } else if (declaration is PhysicalType) { PhysicalType type = declaration as PhysicalType; res.Add(type); res.Add(new PhysicalLiteral(null, type.PrimaryUnit, declaration as PhysicalType)); foreach (PhysicalType.Unit unit in type.Units) { res.Add(unit.Identifier); } } else if (declaration is NamedEntity) { INamedEntity identElement = (NamedEntity)declaration; res.Add(declaration); } else if (declaration is SignalDeclaration) { SignalDeclaration objDecl = declaration as SignalDeclaration; foreach (var o in objDecl.Objects) { res.Add(o); } } else if (declaration is ConstantDeclaration) { ConstantDeclaration objDecl = declaration as ConstantDeclaration; foreach (var o in objDecl.Objects) { res.Add(o); } } else if (declaration is VariableDeclaration) { VariableDeclaration objDecl = declaration as VariableDeclaration; foreach (var o in objDecl.Objects) { res.Add(o); } } else if (declaration is FileDeclaration) { FileDeclaration objDecl = declaration as FileDeclaration; foreach (var o in objDecl.Objects) { res.Add(o); } } else if (declaration is Alias) { res.Add(declaration); } else if (declaration is Subtype) { res.Add(declaration); } else if (declaration is UseClause) { UseClause use = declaration as UseClause; res.AddRange(use.Scope.GetLocalListOfObjects()); } else if (declaration.GetType().BaseType == typeof(ObjectDeclaration <>)) { ObjectDeclaration <VhdlObject> objDecl = declaration as ObjectDeclaration <VhdlObject>; foreach (VhdlObject o in objDecl.Objects) { res.Add(o); } } } return(res); }
public object Resolve(string identifier) { foreach (E declaration in this) { if (declaration is EnumerationType) { EnumerationType type = declaration as EnumerationType; if (identifier.EqualsIdentifier(type.Identifier)) { return(type); } //TODO: support overloading foreach (EnumerationLiteral literal in type.Literals) { if (identifier.EqualsIdentifier(literal.ToString())) { return(literal); } } } else if (declaration is RecordType) { RecordType type = declaration as RecordType; if (identifier.EqualsIdentifier(type.Identifier)) { return(type); } foreach (VHDL.type.RecordType.ElementDeclaration el in type.Elements) { foreach (string name in el.Identifiers) { if (identifier.EqualsIdentifier(name)) { return(new Variable(name, el.Type)); } } } } else if (declaration is PhysicalType) { PhysicalType type = declaration as PhysicalType; if (identifier.EqualsIdentifier(type.Identifier)) { return(type); } //TODO: don't use strings for the physical literals if (identifier.EqualsIdentifier(type.PrimaryUnit)) { return(new PhysicalLiteral(null, type.PrimaryUnit, declaration as PhysicalType)); } foreach (PhysicalType.Unit unit in type.Units) { if (identifier.EqualsIdentifier(unit.Identifier)) { return(new PhysicalLiteral(null, unit.Identifier, declaration as PhysicalType)); } } } else if (declaration is NamedEntity) { INamedEntity identElement = (NamedEntity)declaration; if (identifier.EqualsIdentifier(identElement.Identifier)) { return(declaration); } } else if (declaration is SignalDeclaration) { SignalDeclaration objDecl = declaration as SignalDeclaration; foreach (var o in objDecl.Objects) { if (o.Identifier.EqualsIdentifier(identifier)) { return(o); } } } else if (declaration is ConstantDeclaration) { ConstantDeclaration objDecl = declaration as ConstantDeclaration; foreach (var o in objDecl.Objects) { if (o.Identifier.EqualsIdentifier(identifier)) { return(o); } } } else if (declaration is VariableDeclaration) { VariableDeclaration objDecl = declaration as VariableDeclaration; foreach (var o in objDecl.Objects) { if (o.Identifier.EqualsIdentifier(identifier)) { return(o); } } } else if (declaration is FileDeclaration) { FileDeclaration objDecl = declaration as FileDeclaration; foreach (var o in objDecl.Objects) { if (o.Identifier.EqualsIdentifier(identifier)) { return(o); } } } else if (declaration is Alias) { Alias objDecl = declaration as Alias; if (objDecl.Designator.EqualsIdentifier(identifier)) { return(objDecl.Aliased);//new Variable(objDecl.Aliased, objDecl.SubtypeIndication); } } else if (declaration is Subtype) { Subtype objDecl = declaration as Subtype; if (objDecl.Identifier.EqualsIdentifier(identifier)) { return(objDecl); } } else if (declaration is UseClause) { UseClause use = declaration as UseClause; object res = use.Scope.resolve(identifier); if (res != null) { return(res); } } else if (declaration.GetType().BaseType == typeof(ObjectDeclaration <>)) { ObjectDeclaration <VhdlObject> objDecl = declaration as ObjectDeclaration <VhdlObject>; foreach (VhdlObject o in objDecl.Objects) { if (o.Identifier.EqualsIdentifier(identifier)) { return(o); } } } } return(null); }
public virtual void VisitUseClause(UseClause useClause) { DefaultVisit(useClause); }
protected override void visitUseClause(UseClause useClause) { writer.Append(KeywordEnum.USE.ToString()).Append(' '); writer.AppendStrings(useClause.getDeclarations(), ", "); writer.Append(';').NewLine(); }
/// <summary> /// Проверка оператора use (поиск соответствующего пакета или элемента пакета) /// </summary> /// <param name="tree"></param> /// <param name="useClause"></param> public bool CheckUseClause(ParserRuleContext tree, UseClause useClause) { List <string> declarations = useClause.getDeclarations(); foreach (string declaration in declarations) { string[] elems = declaration.Split(new char[] { '.' }, StringSplitOptions.RemoveEmptyEntries); if ((elems != null) && (elems.Length == 3)) { //Ищем библиотеку string libraryName = elems[0]; IList <LibraryDeclarativeRegion> libraries = rootScope.Libraries; foreach (LibraryDeclarativeRegion library in libraries) { if ((library != null) && (library.Identifier.EqualsIdentifier(libraryName))) { //Нашли необходимую библиотеку //Ищем пакет string packageName = elems[1]; foreach (VhdlFile file in library.Files) { foreach (LibraryUnit unit in file.Elements) { if (unit is PackageDeclaration) { PackageDeclaration packege = unit as PackageDeclaration; if (packege.Identifier.EqualsIdentifier(packageName)) { //Нашли необходимый пакет //Ищем нужный элемент string elemName = elems[2]; if (elemName.EqualsIdentifier("all")) { if (useClause.LinkedElements.Contains(packege) == false) { useClause.LinkedElements.Add(packege); } return(true); } object o = packege.Scope.resolveLocal(elemName); if ((o != null) && (o is INamedEntity)) { INamedEntity el = o as INamedEntity; if (useClause.LinkedElements.Contains(el) == false) { useClause.LinkedElements.Add(el); } return(true); } else { throw new VHDL.ParseError.vhdlUnknownUseClauseItemException(tree, FileName, elemName); return(false); } } } } } throw new VHDL.ParseError.vhdlUnknownUseClausePrimaryUnitException(tree, FileName, packageName); return(false); } } throw new VHDL.ParseError.vhdlUnknownLibraryException(tree, FileName, libraryName); return(false); } else { throw new VHDL.ParseError.vhdlIllegalUseClauseException(tree, FileName); } } return(true); }