예제 #1
0
        public static Either <ParseException, Pair <List <IToken>, TypeNode> > Parse(List <IToken> tokens, SymT symT, IScopedTable <IEntityType, string> parentTypeTable)
        {
            Console.WriteLine("TypeNode");
            var maybePrimitiveType = PrimitiveTypeNode.Parse(tokens);

            if (maybePrimitiveType.IsLeft)
            {
                var maybeArrayType = ArrayTypeNode.Parse(tokens, symT, parentTypeTable);
                if (maybeArrayType.IsLeft)
                {
                    SymT NewSymT         = new SymT(symT);
                    var  maybeRecordType = RecordTypeNode.Parse(tokens, NewSymT, parentTypeTable);

                    if (maybeRecordType.IsLeft)
                    {
                        if (tokens.Count < 1)
                        {
                            return(NotATypeException);
                        }
                        if (!(tokens[0] is IdentifierToken))
                        {
                            return(NotATypeException);
                        }
                        IdentifierToken identifier = (IdentifierToken)tokens[0];
                        if (!(symT.ContainRec(identifier)))
                        {
                            // TODO: return an exception instead
                            Console.Write("No such identifier");
                        }
                        tokens = tokens.Skip(1).ToList();
                        return(new Pair <List <IToken>, TypeNode> (tokens, new TypeNode(identifier)));
                    }
                    tokens = maybeRecordType.RightToList()[0].First;
                    return(new Pair <List <IToken>, TypeNode> (tokens, new TypeNode(
                                                                   maybeRecordType.RightToList()[0].Second)));
                }
                tokens = maybeArrayType.RightToList()[0].First;
                return(new Pair <List <IToken>, TypeNode> (tokens, new TypeNode(
                                                               maybeArrayType.RightToList()[0].Second)));
            }

            tokens = maybePrimitiveType.RightToList()[0].First;
            return(new Pair <List <IToken>, TypeNode> (tokens, new TypeNode(
                                                           maybePrimitiveType.RightToList()[0].Second)));
        }
예제 #2
0
 public TypeNode(RecordTypeNode record)
 {
     Record = record;
 }