public void ParseTest() {
            var context = new ParserContext(new Vrml97Tokenizer(new StringReader(@"
USE qwe123
")));
            var statement = UseStatement.Parse(context);
            Assert.AreEqual("qwe123", statement.NodeName);
        }
        public void ParseTest() {
            var context = new ParserContext(new Vrml97Tokenizer(new StringReader(@"
eventOut SFInt32 click
")));
            var statement = ProtoEventOutStatement.Parse(context);
            Assert.AreEqual("SFInt32", statement.FieldType);
            Assert.AreEqual("click", statement.EventId);
        }
        public void ParseTest() {
            var context = new ParserContext(new Vrml97Tokenizer(new StringReader(@"
field SFInt32 test
")));
            var statement = ExternFieldStatement.Parse(context);
            Assert.AreEqual("SFInt32", statement.FieldType);
            Assert.AreEqual("test", statement.FieldId);
        }
        public void ParseTest() {
            var context = new ParserContext(new Vrml97Tokenizer(new StringReader(@"
exposedField SFInt32 test 2
")));
            var statement = ProtoExposedFieldStatement.Parse(context, c => { });
            Assert.AreEqual("SFInt32", statement.FieldType);
            Assert.AreEqual("test", statement.FieldId);
            Assert.AreEqual(2, ((SFInt32)statement.Value).Value);
        }
        public void ParseTest() {
            var context = new ParserContext(new Vrml97Tokenizer(new StringReader(@"
ROUTE nodeOut.eventOut TO nodeIn.eventIn
")));
            var statement = RouteStatement.Parse(context);
            Assert.AreEqual("nodeOut", statement.NodeOut);
            Assert.AreEqual("eventOut", statement.EventOut);
            Assert.AreEqual("nodeIn", statement.NodeIn);
            Assert.AreEqual("eventIn", statement.EventIn);
        }
        public void ParseTest() {
            var context = new ParserContext(new Vrml97Tokenizer(new StringReader(@"
exposedField SFInt32 test 15
")));
            var statement = ExposedFieldStatement.Parse(context, c => { });
            Assert.AreEqual("SFInt32", statement.FieldType);
            Assert.AreEqual("test", statement.FieldId);
            Assert.IsAssignableFrom(typeof(SFInt32), statement.Value);
            Assert.AreEqual(15, ((SFInt32)statement.Value).Value);
        }
        public void ParseEmptyTest() {
            var context = new ParserContext(new Vrml97Tokenizer(new StringReader(@"
[
]
")));
            var statement = ExternInterfaceDeclarationsStatement.Parse(context);
            Assert.AreEqual(0, statement.EventsIn.Count);
            Assert.AreEqual(0, statement.EventsOut.Count);
            Assert.AreEqual(0, statement.Fields.Count);
            Assert.AreEqual(0, statement.ExposedFields.Count);
        }
        public void Parse(MFNode container) {
            var context = new ParserContext(_tokenizer);
            try {
                _fieldParser = new FieldParser(context, ParseNodeStatement);

                context.PushNodeContainer(container);

                ParseStatements(context);

                context.PopNodeContainer();

            } catch (VrmlParseException exc) {
                throw new InvalidVRMLSyntaxException(exc.Message + " at Line: " + context.LineIndex + " Column: " + context.ColumnIndex);
            }
        }
 protected virtual void ParseStatement(ParserContext context) {
     var token = context.PeekNextToken();
     switch (token.Text) {
         case "DEF":
         case "USE":
             ParseNodeStatement(context);
             break;
         case "PROTO":
         case "EXTERNPROTO":
             ParseProtoStatement(context);
             break;
         case "ROUTE":
             ParseRouteStatement(context);
             break;
         default:
             if (token.Type == VRML97TokenType.Word) {
                 ParseNodeStatement(context);
             } else {
                 throw new Exception("Unexpected context");
             }
             break;
     }
 }
 protected virtual void ParseStatements(ParserContext context) {
     bool validToken;
     do {
         var token = context.PeekNextToken();
         switch (token.Text) {
             case "DEF":
             case "USE":
             case "PROTO":
             case "EXTERNPROTO":
             case "ROUTE":
                 validToken = true;
                 ParseStatement(context);
                 break;
             default:
                 if (token.Type == VRML97TokenType.Word) {
                     ParseStatement(context);
                     validToken = true;
                 } else {
                     validToken = false;
                 }
                 break;
         }
     } while (validToken);
 }
 protected virtual void ParseDefNodeStatement(ParserContext context) {
     context.ReadNextToken();
     context.NodeName = ParseNodeNameId(context);
     ParseNode(context);
 }
 protected virtual void ParseNodeStatement(ParserContext context) {
     var token = context.PeekNextToken();
     switch (token.Text) {
         case "DEF":
             ParseDefNodeStatement(context);
             break;
         case "USE":
             var useStatement = UseStatement.Parse(context);
             var node = context.FindNode(useStatement.NodeName);
             context.AcceptChild(node);
             break;
         default:
             ParseNode(context);
             break;
     }
 }
 private string ParseFieldType(ParserContext context) {
     return context.ParseFieldType();
 }
 protected virtual void ParseURLList(ParserContext context) {
     MFString urls = new MFString();
     urls.AcceptVisitor(_fieldParser);
     //TODO: Process Urls.
 }
 protected virtual void ParseRouteStatement(ParserContext context) {
     var statement = RouteStatement.Parse(context);
     //TODO: Process route statement.
 }
 private static string ParseId(ParserContext context) {
     return context.ReadNextToken().Text;
 }
        protected virtual void ParseExternProto(ParserContext context) {
            context.ReadKeyword("EXTERNPROTO");

            var nodeTypeId = ParseNodeTypeId(context);
            ParseExternInterfaceDeclarations(context);
            ParseURLList(context);
            //TODO: Process extern proto.
        }
 protected virtual void ParseScriptNode(ParserContext context) {
     var keyword = context.ReadNextToken();
     if (keyword.Text != "Script") {
         throw new InvalidVRMLSyntaxException("Script expected");
     }
     context.ReadOpenBrace();
     ParseScriptBody(context);
     context.ReadCloseBrace();
 }
 protected virtual void ParseNode(ParserContext context) {
     var token = context.PeekNextToken();
     if (token.Type == VRML97TokenType.EOF) return;
     switch (token.Text) {
         case "Script":
             ParseScriptNode(context);
             break;
         default:
             var nodeTypeId = ParseNodeTypeId(context);
             var node = context.CreateNode(nodeTypeId, context.NodeName);
             context.NodeName = null;
             context.PushFieldContainer(node);
             if (context.ReadNextToken().Type != VRML97TokenType.OpenBrace) {
                 throw new InvalidVRMLSyntaxException("Open brace expected");
             }
             ParseNodeBody(context);
             if (context.ReadNextToken().Type != VRML97TokenType.CloseBrace) {
                 throw new InvalidVRMLSyntaxException();
             }
             context.PopFieldContainer();
             context.AcceptChild(node);
             break;
     }
 }
 private static string ParseNodeNameId(ParserContext context) {
     return context.ParseNodeNameId();
 }
 protected virtual void ParseNodeBodyElement(ParserContext context) {
     var node = context.FieldContainer;
     if (node == null) {
         throw new Exception("Invalid context");
     }
     var token = context.PeekNextToken();
     switch (token.Text) {
         case "ROUTE":
             ParseRouteStatement(context);
             break;
         case "PROTO":
             ParseProto(context);
             break;
     }
     string fieldId = ParseFieldId(context);
     token = context.PeekNextToken();
     //TODO: get field type and parse depending on it.
     switch (token.Text) {
         case "IS":
             token = context.ReadNextToken();
             string interfaceFieldId = ParseFieldId(context);
             //TODO: Process inteface field linking
             break;
         default:
             var field = node.GetExposedField(fieldId);
             field.AcceptVisitor(_fieldParser);
             break;
     }
 }
 protected virtual void ParseScriptBodyElement(ParserContext context) {
     var token = context.PeekNextToken();
     VRML97Token tokenIs = null;
     string fieldType;
     switch (token.Text) {
         case "eventIn":
             tokenIs = context.PeekNextToken(3);
             if (tokenIs.Text == "IS") {
                 token = context.ReadNextToken();
                 fieldType = ParseFieldType(context);
                 string eventInId1 = ParseEventInId(context);
                 tokenIs = context.ReadNextToken();
                 string eventInId2 = ParseEventInId(context);
                 //TODO: process scipt eventIn element
             } else {
                 ParseRestrictedInterfaceDeclaration(context);
             }
             break;
         case "eventOut":
             tokenIs = context.PeekNextToken(3);
             if (tokenIs.Text == "IS") {
                 token = context.ReadNextToken();
                 fieldType = ParseFieldType(context);
                 string eventOutId1 = ParseEventOutId(context);
                 tokenIs = context.ReadNextToken();
                 string eventOutId2 = ParseEventOutId(context);
                 //TODO: process scipt eventOut element
             } else {
                 ParseRestrictedInterfaceDeclaration(context);
             }
             break;
         case "field":
             tokenIs = context.PeekNextToken(3);
             if (tokenIs.Text == "IS") {
                 token = context.ReadNextToken();
                 fieldType = ParseFieldType(context);
                 string fieldId1 = ParseFieldId(context);
                 tokenIs = context.ReadNextToken();
                 string fieldId2 = ParseFieldId(context);
                 //TODO: process scipt field element
             } else {
                 ParseRestrictedInterfaceDeclaration(context);
             }
             break;
         default:
             if (token.Type == VRML97TokenType.Word) {
                 ParseNodeBodyElement(context);
             } else {
                 throw new Exception("Unexpected context");
             }
             break;
     }
 }
 protected virtual void ParseNodeBody(ParserContext context) {
     var validToken = true;
     do {
         var token = context.PeekNextToken();
         if (token.Type == VRML97TokenType.Word) {
             ParseNodeBodyElement(context);
         } else {
             validToken = false;
         }
     } while (validToken);
 }
 protected virtual void ParseExternInterfaceDeclarations(ParserContext context) {
     var statement = ExternInterfaceDeclarationsStatement.Parse(context);
     //TODO: process extern interface declarations.
 }
        private void ParseInterfaceDeclarations(ParserContext context) {
            var statement = ProtoInterfaceDeclarationsStatement.Parse(context, ParseNodeStatement);
            //todo: process interface declarations

            var node = context.FieldContainer as ProtoNode;
            if (node == null) throw new Exception("Unexpected context");

            foreach (var expFld in statement.Fields) {
                var field = expFld.Value;
                node.AddField(expFld.FieldId, field);
            }

            foreach (var expFld in statement.ExposedFields) {
                var field = expFld.Value;
                node.AddExposedField(expFld.FieldId, field);
            }

        }
 private void ParseRestrictedInterfaceDeclaration(ParserContext context) {
     var node = context.FieldContainer as ProtoNode;
     if (node == null) throw new Exception("Unexpected context");
     var accessType = context.ReadNextToken().Text;
     switch (accessType) {
         case "eventIn":
             var fieldInType = ParseFieldType(context);
             var eventInId = ParseEventInId(context);
             //TODO: process interface eventIn declaration.
             break;
         case "eventOut":
             var fieldOutType = ParseFieldType(context);
             var eventOutId = ParseEventOutId(context);
             //TODO: process interface eventOut declaration.
             break;
         case "field":
             var fieldType = ParseFieldType(context);
             var fieldId = ParseFieldId(context);
             var field = context.CreateField(fieldType);
             node.AddField(fieldId, field);
             field.AcceptVisitor(_fieldParser);
             //TODO: process interface field declaration.
             break;
         default:
             throw new Exception("Unexpected context");
     }
 }
 protected virtual string ParseEventInId(ParserContext context) {
     return context.ParseEventInId();
 }
 private string ParseNodeTypeId(ParserContext context) {
     return ParseId(context);
 }
 private static string ParseEventOutId(ParserContext context) {
     return context.ParseEventOutId();
 }
        public void ParseTest() {
            var context = new ParserContext(new Vrml97Tokenizer(new StringReader(@"
[
    eventIn SFInt32 eventIn1
    eventOut SFInt32 eventOut1
    eventIn SFInt32 eventIn2
    eventOut SFInt32 eventOut2
    field SFInt32 field1 1
    exposedField SFInt32 exposedField1 2
    field SFInt32 field2 3
    exposedField SFInt32 exposedField2 4
]
")));
            var statement = ProtoInterfaceDeclarationsStatement.Parse(context, c => { });
            Assert.AreEqual(2, statement.EventsIn.Count);
            Assert.AreEqual(2, statement.EventsOut.Count);
            Assert.AreEqual(2, statement.Fields.Count);
            Assert.AreEqual(2, statement.ExposedFields.Count);

            var firstEventIn = statement.EventsIn.First();
            Assert.AreEqual("SFInt32", firstEventIn.FieldType);
            Assert.AreEqual("eventIn1", firstEventIn.EventId);

            var secondEventIn = statement.EventsIn.Last();
            Assert.AreEqual("SFInt32", secondEventIn.FieldType);
            Assert.AreEqual("eventIn2", secondEventIn.EventId);

            var firstEventOut = statement.EventsOut.First();
            Assert.AreEqual("SFInt32", firstEventOut.FieldType);
            Assert.AreEqual("eventOut1", firstEventOut.EventId);

            var secondEventOut = statement.EventsOut.Last();
            Assert.AreEqual("SFInt32", secondEventOut.FieldType);
            Assert.AreEqual("eventOut2", secondEventOut.EventId);

            var firstField = statement.Fields.First();
            Assert.AreEqual("SFInt32", firstField.FieldType);
            Assert.AreEqual("field1", firstField.FieldId);
            Assert.AreEqual(1, ((SFInt32)firstField.Value).Value);

            var secondField = statement.Fields.Last();
            Assert.AreEqual("SFInt32", secondField.FieldType);
            Assert.AreEqual("field2", secondField.FieldId);
            Assert.AreEqual(3, ((SFInt32)secondField.Value).Value);

            var firstExposedField = statement.ExposedFields.First();
            Assert.AreEqual("SFInt32", firstExposedField.FieldType);
            Assert.AreEqual("exposedField1", firstExposedField.FieldId);
            Assert.AreEqual(2, ((SFInt32)firstExposedField.Value).Value);

            var secondExposedField = statement.ExposedFields.Last();
            Assert.AreEqual("SFInt32", secondExposedField.FieldType);
            Assert.AreEqual("exposedField2", secondExposedField.FieldId);
            Assert.AreEqual(4, ((SFInt32)secondExposedField.Value).Value);
        }