Exemplo n.º 1
0
            public override PLanguageType VisitNamedType(PParser.NamedTypeContext context)
            {
                string typeName = context.name.GetText();

                if (scope.Lookup(typeName, out PEnum pEnum))
                {
                    return(new EnumType(pEnum));
                }

                if (scope.Lookup(typeName, out TypeDef typeDef))
                {
                    if (visitedTypeDefs.Contains(typeDef))
                    {
                        throw handler.CircularTypeDef(context.name, typeDef);
                    }

                    if (typeDef.Type == null)
                    {
                        visitedTypeDefs.Push(typeDef);
                        switch (typeDef.SourceLocation)
                        {
                        case PParser.ForeignTypeDefContext foreignType:
                            typeDef.Type = new ForeignType(foreignType.name.GetText());
                            break;

                        case PParser.PTypeDefContext typedefDecl:
                            typeDef.Type = Visit(typedefDecl.type());
                            break;

                        case InterpreterRuleContext _:
                        case RuleContextWithAltNum _:
                        default:
                            throw handler.InternalError(typeDef.SourceLocation,
                                                        new ArgumentOutOfRangeException(nameof(context)));
                        }
                        visitedTypeDefs.Pop();
                    }

                    return(new TypeDefType(typeDef));
                }

                if (scope.Lookup(typeName, out NamedEventSet eventSet))
                {
                    return(new PermissionType(eventSet));
                }

                if (scope.Lookup(typeName, out Interface pInterface))
                {
                    return(new PermissionType(pInterface));
                }

                if (scope.Lookup(typeName, out Machine machine))
                {
                    return(new PermissionType(machine));
                }

                throw handler.MissingDeclaration(context.name, "enum, typedef, event set, machine, or interface",
                                                 typeName);
            }
Exemplo n.º 2
0
            public override PLanguageType VisitNamedType(PParser.NamedTypeContext context)
            {
                string typeName = context.name.GetText();

                if (scope.Lookup(typeName, out PEnum pEnum))
                {
                    return(new EnumType(pEnum));
                }

                if (scope.Lookup(typeName, out TypeDef typeDef))
                {
                    if (visitedTypeDefs.Contains(typeDef))
                    {
                        throw handler.CircularTypeDef(context.name, typeDef);
                    }

                    if (typeDef.Type == null)
                    {
                        visitedTypeDefs.Add(typeDef);
                        switch (typeDef.SourceLocation)
                        {
                        case PParser.ForeignTypeDefContext foreignType:
                            typeDef.Type = new ForeignType(foreignType.name.GetText());
                            break;

                        case PParser.PTypeDefContext typedefDecl:
                            typeDef.Type = Visit(typedefDecl.type());
                            break;

                        default:
                            throw handler.InternalError(typeDef.SourceLocation,
                                                        $"Grammar changed without updating {nameof(TypeVisitor)}");
                        }
                    }

                    return(new TypeDefType(typeDef));
                }

                if (scope.Lookup(typeName, out NamedEventSet eventSet))
                {
                    return(new PermissionType(eventSet));
                }

                if (scope.Lookup(typeName, out Interface pInterface))
                {
                    return(new PermissionType(pInterface));
                }

                if (scope.Lookup(typeName, out Machine machine))
                {
                    return(new PermissionType(machine));
                }

                throw handler.MissingDeclaration(context.name, "enum, typedef, event set, machine, or interface", typeName);
            }
Exemplo n.º 3
0
 public override object VisitNamedType(PParser.NamedTypeContext context)
 {
     return(null);
 }