void ParseComponentStatements()
        {
            // componentStatement | componentStatement componentStatements | empty

            for (; ;)
            {
                object token = PeekNextToken();
                if (token == null)
                {
                    ErrorUnexpectedEndOfStream();
                }

                VRMLTokenIdKeywordOrFieldType idToken = token as VRMLTokenIdKeywordOrFieldType;
                if (idToken == null)
                {
                    ErrorParsingToken("statement keyword or node id", "", "statement");
                }

                switch (idToken.id)
                {
                case "COMPONENT": ParseComponentStatement(); break;

                default: return;
                }
            }
        }
        X3DPrototypeInstance ParseProtoStatement(out string nodeTypeId)
        {
            // proto | externproto

            object token = PeekNextToken();

            if (token == null)
            {
                ErrorUnexpectedEndOfStream();
            }

            VRMLTokenIdKeywordOrFieldType idToken = token as VRMLTokenIdKeywordOrFieldType;

            if (idToken == null)
            {
                ErrorParsingToken("PROTO or EXTERNPROTO", "", "proto statement");
            }

            switch (idToken.id)
            {
            case "PROTO": return(ParseProto(out nodeTypeId));

            case "EXTERNPROTO": return(ParseExternProto(out nodeTypeId));

            default:
                nodeTypeId = "";
                ErrorParsingToken("PROTO or EXTERNPROTO", idToken.id, "proto statement");
                return(null);
            }
        }
        void ParseMetaStatement()
        {
            // META metakey metavalue

            object token = PeekNextToken();

            if (token == null)
            {
                ErrorUnexpectedEndOfStream();
            }

            VRMLTokenIdKeywordOrFieldType idToken = token as VRMLTokenIdKeywordOrFieldType;

            if (idToken == null)
            {
                ErrorParsingToken("META", "", "META statement");
            }

            if (idToken.id == "META")
            {
                GetNextIDToken();                 // META keyword
                string metakey   = GetNextStringToken();
                string metavalue = GetNextStringToken();
            }
        }
        void ParseComponentStatement()
        {
            // COMPONENT componentNameId : componentSupportLevel

            object token = PeekNextToken();

            if (token == null)
            {
                ErrorUnexpectedEndOfStream();
            }

            VRMLTokenIdKeywordOrFieldType idToken = token as VRMLTokenIdKeywordOrFieldType;

            if (idToken == null)
            {
                ErrorParsingToken("COMPONENT", "", "COMPONENT statement");
            }

            if (idToken.id != "COMPONENT")
            {
                return;
            }

            GetNextIDToken();             // COMPONENT keyword
            string componentNameId = GetNextIDToken(true);

            GetNextColonToken();             // :

            int componentSupportLevel = GetIntNumber(GetNextNumberToken());
        }
Esempio n. 5
0
        internal X3DNode ParseSFNodeValue()
        {
            // nodeStatement | NULL

            try
            {
                object token = PeekNextToken();
                if (token == null)
                {
                    ErrorUnexpectedEndOfStream();
                }

                VRMLTokenIdKeywordOrFieldType idToken = token as VRMLTokenIdKeywordOrFieldType;
                if (idToken == null)
                {
                    ErrorParsingToken("node statement keyword, node id or NULL", "", "sfnodeValue");
                }

                switch (idToken.id)
                {
                case "NULL":
                    string tokenNULL = GetNextIDToken();
                    return(null);

                default: return(ParseNodeStatement());
                }
            }
            catch (UserCancellationException) { throw; }
            catch (Exception ex)
            {
                ErrorParsingField(VRMLReaderError.SFNodeInvalid, ex);
            }

            return(null);
        }
Esempio n. 6
0
        internal List <X3DNode> ParseSFNodeOrMFNodeValue()
        {
            // nodeStatement | [ ] | [ nodeStatements ]

            try
            {
                object token = PeekNextToken();

                List <X3DNode> ret = new List <X3DNode>();

                VRMLTokenTerminalSymbol tsToken = token as VRMLTokenTerminalSymbol;
                if (tsToken != null && tsToken.symbol == '[')
                {
                    char ts = GetNextTerminalSymbolToken();

                    for (; ;)
                    {
                        token   = PeekNextToken();
                        tsToken = token as VRMLTokenTerminalSymbol;
                        if (tsToken != null && tsToken.symbol == ']')
                        {
                            ts = GetNextTerminalSymbolToken();
                            break;
                        }

                        X3DNode node = ParseNodeStatement();
                        if (node != null)
                        {
                            ret.Add(node);
                        }
                    }
                }
                else
                {
                    VRMLTokenIdKeywordOrFieldType nullToken = token as VRMLTokenIdKeywordOrFieldType;
                    if (nullToken != null && nullToken.id == "NULL")
                    {
                        GetNextIDToken();                         // consume NULL
                        ErrorParsing(VRMLReaderError.ImproperInitializationOfMFNode);
                    }
                    else
                    {
                        X3DNode node = ParseNodeStatement();
                        if (node != null)
                        {
                            ret.Add(node);
                        }
                    }
                }

                return(ret);
            }
            catch (UserCancellationException) { throw; }
            catch (Exception ex)
            {
                ErrorParsingField(VRMLReaderError.MFNodeInvalid, ex);
            }

            return(null);
        }
        void ParseProtoStatements()
        {
            // protoStatement | protoStatement protoStatements | empty

            for (; ;)
            {
                object token = PeekNextToken();
                if (token == null)
                {
                    ErrorUnexpectedEndOfStream();
                }

                VRMLTokenIdKeywordOrFieldType idToken = token as VRMLTokenIdKeywordOrFieldType;
                if (idToken == null)
                {
                    ErrorParsingToken("statement keyword or node id", "", "proto statements");
                }

                switch (idToken.id)
                {
                case "PROTO":
                case "EXTERNPROTO":
                    string nodeTypeId;
                    X3DPrototypeInstance proto = ParseProtoStatement(out nodeTypeId);
                    protoDefinitions.Add(nodeTypeId, proto);
                    break;

                default: return;
                }
            }
        }
Esempio n. 8
0
        internal object GetNextNumberToken()
        {
            object          token       = ConsumeNextToken(false, false, false);
            VRMLTokenNumber numberToken = token as VRMLTokenNumber;

            if (numberToken == null)
            {
                VRMLTokenIdKeywordOrFieldType idToken = token as VRMLTokenIdKeywordOrFieldType;
                if (idToken != null)
                {
                    string id = idToken.id.ToLower();
                    if (id == "infinity")
                    {
                        return(double.PositiveInfinity);
                    }
                    if (id == "nan")
                    {
                        return(double.NaN);
                    }
                }

                ErrorParsingToken("number", token);
            }

            return(numberToken.number);
        }
Esempio n. 9
0
        internal string GetNextIDToken(bool colonIsTerminalSymbol)
        {
            object token = ConsumeNextToken(false, colonIsTerminalSymbol, false);
            VRMLTokenIdKeywordOrFieldType idToken = token as VRMLTokenIdKeywordOrFieldType;

            if (idToken == null)
            {
                ErrorParsingToken("keyword or id", token);
            }

            return(idToken.id);
        }
Esempio n. 10
0
        internal X3DFieldBase ParseUntypedFieldValue()
        {
            object token = PeekNextToken();

            #region sfboolValue or sfnodeValue (NULL or Node(s))
            VRMLTokenIdKeywordOrFieldType idToken = token as VRMLTokenIdKeywordOrFieldType;

            if (idToken != null)
            {
                switch (idToken.id)
                {
                case "TRUE": GetNextIDToken(); return(new SFBool(true));

                case "FALSE": GetNextIDToken(); return(new SFBool(false));

                case "NULL": GetNextIDToken(); return(null);

                default: return(ParseNodeStatement());
                }
            }
            #endregion

            #region mf*Values ([-Token)
            VRMLTokenTerminalSymbol tsToken = token as VRMLTokenTerminalSymbol;
            if (tsToken != null)
            {
                if (tsToken.symbol != '[')
                {
                    ErrorParsingToken("[", tsToken.symbol.ToString(), "unknown type value");
                }
                return(ParseUntypedFieldValueArray());
            }
            #endregion

            #region sfstringValue
            VRMLTokenString strToken = token as VRMLTokenString;
            if (strToken != null)
            {
                return(new SFString(GetNextStringToken()));
            }
            #endregion

            #region sfcolorValue, sffloatValue, sfimageValue, sfint32Value, sfrotationValue, sftimeValue, sfvec2fValue or sfvec3fValue
            VRMLTokenNumber numberToken = token as VRMLTokenNumber;
            if (numberToken != null)
            {
                return(new SFNumbers(ParseUntypedFieldValueNumbers()));
            }
            #endregion

            return(null);
        }
        void ParseStatement()
        {
            // nodeStatement | protoStatement | exportStatement | importStatement | routeStatement

            object token = PeekNextToken();

            if (token == null)
            {
                ErrorUnexpectedEndOfStream();
            }

            VRMLTokenIdKeywordOrFieldType idToken = token as VRMLTokenIdKeywordOrFieldType;

            if (idToken == null)
            {
                ErrorParsingToken("statement keyword or node id", "", "statement");
            }

            switch (idToken.id)
            {
            case "PROTO":
            case "EXTERNPROTO":
                string nodeTypeId;
                int    lineOfProtoStart    = line;
                X3DPrototypeInstance proto = ParseProtoStatement(out nodeTypeId);
                if (protoDefinitions.ContainsKey(nodeTypeId))
                {
                    ErrorParsing(VRMLReaderError.PROTOAlreadyDefined, lineOfProtoStart);
                }
                else
                {
                    protoDefinitions.Add(nodeTypeId, proto);
                }
                break;

            case "EXPORT": ParseExportStatement(); break;

            case "IMPORT": ParseImportStatement(); break;

            case "ROUTE": ParseRouteStatement(); break;

            default:
                X3DNode node = ParseNodeStatement();
                if (node != null)
                {
                    nodes.Add(node);
                }
                break;
            }
        }
        X3DNode ParseNodeStatement()
        {
            // node | DEF nodeNameId node | USE nodeNameId

            object token = PeekNextToken();

            if (token == null)
            {
                ErrorUnexpectedEndOfStream();
            }

            VRMLTokenIdKeywordOrFieldType idToken = token as VRMLTokenIdKeywordOrFieldType;

            if (idToken == null)
            {
                ErrorParsingToken("DEF, USE or node id", "", "node statement");
            }

            switch (idToken.id)
            {
            case "DEF":
            {
                string  tokenDEF   = GetNextIDToken();
                string  nodeNameId = GetNextIDToken();
                X3DNode node       = ParseNode(nodeNameId);
                if (node == null)
                {
                    ErrorUnexpectedEndOfStream();
                }
                instances[nodeNameId] = node;
                return(node);
            }

            case "USE":
            {
                string tokenUSE   = GetNextIDToken();
                string nodeNameId = GetNextIDToken();
                if (instances.ContainsKey(nodeNameId))
                {
                    return(instances[nodeNameId]);
                }
                ErrorParsing(VRMLReaderError.USENameNotDefined);
                return(null);
            }

            default: return(ParseNode(null));
            }
        }
Esempio n. 13
0
        X3DFieldBase ParseUntypedFieldValueArray()
        {
            char ts = GetNextTerminalSymbolToken();           // [

            object token = PeekNextToken();

            X3DFieldBase ret = null;

            VRMLTokenIdKeywordOrFieldType idToken = token as VRMLTokenIdKeywordOrFieldType;

            if (idToken != null)
            {
                ret = new MFNode(ParseUntypedFieldValueNodeArray());
            }

            VRMLTokenString strToken = token as VRMLTokenString;

            if (strToken != null)
            {
                ret = new MFString(ParseUntypedFieldValueStringArray());
            }

            VRMLTokenNumber numberToken = token as VRMLTokenNumber;

            if (numberToken != null)
            {
                ret = new MFNumbers(ParseUntypedFieldValueNumbers());
            }

            ts = GetNextTerminalSymbolToken();
            if (ts != ']')
            {
                ErrorParsingToken("]", ts.ToString(), "unknown type value (array)");
            }

            if (ret == null)
            {
                ret = new MFEmpty();
            }
            return(ret);
        }
        List <InterfaceDeclaration> ParseExternInterfaceDeclarations()
        {
            // externInterfaceDeclaration | externInterfaceDeclaration externInterfaceDeclarations | empty

            List <InterfaceDeclaration> ret = new List <InterfaceDeclaration>();

            for (; ;)
            {
                object token = PeekNextToken();

                VRMLTokenTerminalSymbol tsToken = token as VRMLTokenTerminalSymbol;
                if (tsToken != null && tsToken.symbol == ']')
                {
                    return(ret);                                                   // done
                }
                VRMLTokenIdKeywordOrFieldType idToken = token as VRMLTokenIdKeywordOrFieldType;
                if (idToken == null)
                {
                    ErrorParsingToken("interface declaration keyword", "", "EXTRENPROTO statement interface declarations");
                }

                switch (idToken.id)
                {
                case "eventIn":
                case "inputOnly":
                case "eventOut":
                case "outputOnly":
                case "field":
                case "initializeOnly":
                case "exposedField":
                case "inputOutput": ret.Add(ParseExternInterfaceDeclaration()); break;

                default:
                    ErrorParsingToken("interface declaration keyword", idToken.id, "EXTRENPROTO statement interface declarations");
                    return(null);
                }
            }
        }
        void ParseProfileStatement()
        {
            // PROFILE profileNameId

            object token = PeekNextToken();

            if (token == null)
            {
                ErrorUnexpectedEndOfStream();
            }

            VRMLTokenIdKeywordOrFieldType idToken = token as VRMLTokenIdKeywordOrFieldType;

            if (idToken == null)
            {
                ErrorParsingToken("statement keyword or node id", "", "statement");
            }

            if (idToken.id == "PROFILE")
            {
                GetNextIDToken();                 // PROFILE keyword
                string profileNameId = GetNextIDToken();
            }
        }
        X3DNode ParseRootNodeStatement()
        {
            // node | DEF nodeNameId node

            object token = PeekNextToken();

            if (token == null)
            {
                ErrorUnexpectedEndOfStream();
            }

            VRMLTokenIdKeywordOrFieldType idToken = token as VRMLTokenIdKeywordOrFieldType;

            if (idToken == null)
            {
                ErrorParsingToken("DEF or node id", "", "root node statement");
            }

            switch (idToken.id)
            {
            case "DEF":
            {
                string  tokenDEF   = GetNextIDToken();
                string  nodeNameId = GetNextIDToken();
                X3DNode node       = ParseNode(nodeNameId);
                if (node == null)
                {
                    ErrorUnexpectedEndOfStream();
                }
                instances[nodeNameId] = node;
                return(node);
            }

            default: return(ParseNode(null));
            }
        }
Esempio n. 17
0
        internal FieldType GetNextFieldTypeToken()
        {
            object token = ConsumeNextToken(false, false, false);
            VRMLTokenIdKeywordOrFieldType idToken = token as VRMLTokenIdKeywordOrFieldType;

            if (idToken == null)
            {
                ErrorParsingToken("fieldType", token);
            }

            switch (idToken.id)
            {
            case "MFBool": return(FieldType.MFBool);

            case "MFColor": return(FieldType.MFColor);

            case "MFColorRGBA": return(FieldType.MFColorRGBA);

            case "MFDouble": return(FieldType.MFFloat);

            case "MFFloat": return(FieldType.MFFloat);

            case "MFImage": return(FieldType.MFImage);

            case "MFInt32": return(FieldType.MFInt32);

            case "MFMatrix3d":
            case "MFMatrix3f": return(FieldType.MFMatrix3f);

            case "MFMatrix4d":
            case "MFMatrix4f": return(FieldType.MFMatrix4f);

            case "MFNode": return(FieldType.MFNode);

            case "MFRotation": return(FieldType.MFRotation);

            case "MFString": return(FieldType.MFString);

            case "MFTime": return(FieldType.MFTime);

            case "MFVec2d":
            case "MFVec2f": return(FieldType.MFVec2f);

            case "MFVec3f":
            case "MFVec3d": return(FieldType.MFVec3f);

            case "MFVec4d":
            case "MFVec4f": return(FieldType.MFVec4f);

            case "SFBool": return(FieldType.SFBool);

            case "SFColor": return(FieldType.SFColor);

            case "SFColorRGBA": return(FieldType.SFColorRGBA);

            case "SFDouble":
            case "SFFloat": return(FieldType.SFFloat);

            case "SFImage": return(FieldType.SFImage);

            case "SFInt32": return(FieldType.SFInt32);

            case "SFMatrix3d":
            case "SFMatrix3f": return(FieldType.SFMatrix3f);

            case "SFMatrix4d":
            case "SFMatrix4f": return(FieldType.SFMatrix4f);

            case "SFNode": return(FieldType.SFNode);

            case "SFRotation": return(FieldType.SFRotation);

            case "SFString": return(FieldType.SFString);

            case "SFTime": return(FieldType.SFTime);

            case "SFVec2d":
            case "SFVec2f": return(FieldType.SFVec2f);

            case "SFVec3d":
            case "SFVec3f": return(FieldType.SFVec3f);

            case "SFVec4d":
            case "SFVec4f": return(FieldType.SFVec4f);

            default: ErrorParsingToken("fieldType", idToken.id);
                return(FieldType.SFInt32);                        // dummy to silence the compiler
            }
        }