Пример #1
0
        [Test] public void SimpleLexer()
        {
            StructLexer lexer = new StructLexer("struct BITMAPINFOHEADER { }");

            Assert.AreEqual(StructTokenType.String, lexer.PeekNextToken());
            Assert.AreEqual("struct", lexer.GetNextToken(StructTokenType.String));
            Assert.AreEqual(StructTokenType.String, lexer.PeekNextToken());
            Assert.AreEqual("BITMAPINFOHEADER", lexer.GetNextToken(StructTokenType.String));
            Assert.IsTrue(lexer.CheckNextToken(StructTokenType.OpenCurly));
            Assert.IsTrue(lexer.CheckNextToken(StructTokenType.CloseCurly));
            Assert.IsTrue(lexer.EndOfStream());
        }
Пример #2
0
 public void CStyleComment()
 {
     StructLexer lexer = new StructLexer("/* test \nalso test\nend*/ struct A { }");
     Assert.AreEqual(StructTokenType.String, lexer.PeekNextToken());
     Assert.AreEqual(3, lexer.CurrentPosition.Line);
     Assert.AreEqual("struct", lexer.GetNextToken(StructTokenType.String));
 }
Пример #3
0
 private static void LoadAttributes(StructLexer lexer, List<Attribute> attrs)
 {
     if (lexer.PeekNextToken() == StructTokenType.OpenSquare)
     {
         lexer.GetNextToken(StructTokenType.OpenSquare);
         while(true)
         {
             TextPosition pos = lexer.CurrentPosition;
             string attrName = lexer.GetNextToken(StructTokenType.String);
             string attrValue;
             if (lexer.CheckNextToken(StructTokenType.Equals))
             {
                 attrValue = lexer.GetAttributeValue(out pos);
             }
             else
             {
                 attrValue = "1";
             }
             attrs.Add(new Attribute(attrName, attrValue, pos));
             if (lexer.CheckNextToken(StructTokenType.CloseSquare)) break;
             if (!lexer.CheckNextToken(StructTokenType.Comma))
             {
                 throw new Exception("Unexpected token");
             }
         }
     }
 }
Пример #4
0
        [Test] public void CStyleComment()
        {
            StructLexer lexer = new StructLexer("/* test \nalso test\nend*/ struct A { }");

            Assert.AreEqual(StructTokenType.String, lexer.PeekNextToken());
            Assert.AreEqual(3, lexer.CurrentPosition.Line);
            Assert.AreEqual("struct", lexer.GetNextToken(StructTokenType.String));
        }
Пример #5
0
        [Test] public void ParseException()
        {
            ParseException exception = null;

            try
            {
                StructLexer lexer = new StructLexer("struct A {\r\n   !");
                Assert.IsTrue(lexer.CheckNextToken(StructTokenType.String));
                Assert.IsTrue(lexer.CheckNextToken(StructTokenType.String));
                Assert.IsTrue(lexer.CheckNextToken(StructTokenType.OpenCurly));
                lexer.PeekNextToken();
            }
            catch (ParseException e)
            {
                exception = e;
            }
            Assert.IsNotNull(exception);
            Assert.AreEqual(2, exception.Position.Line);
            Assert.AreEqual(3, exception.Position.Col);
        }
Пример #6
0
        public void UnclosedParen()
        {
            StructLexer lexer = new StructLexer("(abc");

            lexer.PeekNextToken();
        }
Пример #7
0
 public void ParseException()
 {
     ParseException exception = null;
     try
     {
         StructLexer lexer = new StructLexer("struct A {\r\n   !");
         Assert.IsTrue(lexer.CheckNextToken(StructTokenType.String));
         Assert.IsTrue(lexer.CheckNextToken(StructTokenType.String));
         Assert.IsTrue(lexer.CheckNextToken(StructTokenType.OpenCurly));
         lexer.PeekNextToken();
     }
     catch(ParseException e)
     {
         exception = e;
     }
     Assert.IsNotNull(exception);
     Assert.AreEqual(2, exception.Position.Line);
     Assert.AreEqual(3, exception.Position.Col);
 }
Пример #8
0
 public void UnclosedParen()
 {
     StructLexer lexer = new StructLexer("(abc");
     lexer.PeekNextToken();
 }
Пример #9
0
 public void SimpleLexer()
 {
     StructLexer lexer = new StructLexer("struct BITMAPINFOHEADER { }");
     Assert.AreEqual(StructTokenType.String, lexer.PeekNextToken());
     Assert.AreEqual("struct", lexer.GetNextToken(StructTokenType.String));
     Assert.AreEqual(StructTokenType.String, lexer.PeekNextToken());
     Assert.AreEqual("BITMAPINFOHEADER", lexer.GetNextToken(StructTokenType.String));
     Assert.IsTrue(lexer.CheckNextToken(StructTokenType.OpenCurly));
     Assert.IsTrue(lexer.CheckNextToken(StructTokenType.CloseCurly));
     Assert.IsTrue(lexer.EndOfStream());
 }
Пример #10
0
        private void LoadFieldGroup(StructLexer lexer, StructDef structDef, StructField parentField)
        {
            lexer.GetNextToken(StructTokenType.OpenCurly);
            StructField linkToField = null;
            while(lexer.PeekNextToken() != StructTokenType.CloseCurly)
            {
                StructField field = LoadField(lexer, structDef, parentField);

                if (field != null)
                {
                    bool isLinked = false;
                    if (linkToField != null)
                        isLinked = linkToField.CanLinkField(field);

                    if (isLinked)
                        linkToField.LinkField(field);
                    else
                        linkToField = field;

                    field.Validate();
                }
            }
            lexer.GetNextToken(StructTokenType.CloseCurly);
        }
Пример #11
0
        private StructField LoadField(StructLexer lexer, StructDef structDef, StructField parentField)
        {
            List<Attribute> attrs = new List<Attribute>();
            LoadAttributes(lexer, attrs);
            TextPosition fieldPosition = lexer.CurrentPosition;
            string fieldType = lexer.GetNextToken(StructTokenType.String);
            StructField field = null;
            try
            {
                field = _fieldFactory.CreateField(structDef, fieldType, _attributeRegistry);
                field.Name = fieldType;
                field.Position = fieldPosition;
            }
            catch(Exception ex)
            {
                _errors.Add(new ParseException(ex.Message, fieldPosition));
            }
            LoadAttributes(lexer, attrs);
            if (lexer.PeekNextToken() != StructTokenType.Semicolon && lexer.PeekNextToken() != StructTokenType.OpenCurly)
            {
                TextPosition pos = lexer.CurrentPosition;
                string tag = lexer.GetNextToken(StructTokenType.String);
                LoadAttributes(lexer, attrs);
                if (field != null)
                    _attributeRegistry.SetFieldAttribute(field, field.DefaultAttribute, tag, pos);
            }

            foreach (Attribute attr in attrs)
                _attributeRegistry.SetFieldAttribute(field, attr.Key, attr.Value, attr.Position);

            if (lexer.PeekNextToken() == StructTokenType.OpenCurly)
                LoadFieldGroup(lexer, structDef, field);
            else
                lexer.GetNextToken(StructTokenType.Semicolon);

            if (field != null)
            {
                field.EndPosition = lexer.LastTokenEndPosition;
                if (parentField == null)
                    structDef.AddField(field);
                else
                    parentField.AddChildField(field);
            }
            return field;
        }
Пример #12
0
        private void LoadEnum(StructLexer lexer, List<Attribute> attrs)
        {
            string name = lexer.GetNextToken(StructTokenType.String);
            EnumDef enumDef = new EnumDef(_curStructFile, name);
            LoadAttributes(lexer, attrs);

            foreach (Attribute attr in attrs)
                enumDef.SetAttribute(attr.Key, attr.Value);

            lexer.GetNextToken(StructTokenType.OpenCurly);
            uint lastValue = UInt32.MaxValue;
            while(!lexer.CheckNextToken(StructTokenType.CloseCurly))
            {
                string constName = lexer.GetNextToken(StructTokenType.String);
                if (lexer.CheckNextToken(StructTokenType.Equals))
                {
                    string constValue = lexer.GetNextToken(StructTokenType.String);
                    lastValue = (uint) ExpressionParser.Parse(constValue).EvaluateInt(null);
                }
                else
                    lastValue++;
                enumDef.AddValue(constName, lastValue);

                if (!lexer.CheckNextToken(StructTokenType.Comma))
                {
                    if (lexer.PeekNextToken() != StructTokenType.CloseCurly)
                        throw new Exception("Unexpected token in enum: " + lexer.PeekNextToken());
                }
            }
            _curStructFile.Add(enumDef);
        }