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"); } } } }
public void LineBreak() { StructLexer lexer = new StructLexer("struct BITMAPINFOHEADER {\n}\n"); Assert.IsTrue(lexer.CheckNextToken(StructTokenType.String)); Assert.IsTrue(lexer.CheckNextToken(StructTokenType.String)); Assert.IsTrue(lexer.CheckNextToken(StructTokenType.OpenCurly)); Assert.IsTrue(lexer.CheckNextToken(StructTokenType.CloseCurly)); Assert.IsTrue(lexer.EndOfStream()); }
public void LineAndCol() { StructLexer lexer = new StructLexer("struct A {\r\n u8"); Assert.IsTrue(lexer.CheckNextToken(StructTokenType.String)); Assert.IsTrue(lexer.CheckNextToken(StructTokenType.String)); Assert.IsTrue(lexer.CheckNextToken(StructTokenType.OpenCurly)); TextPosition pos = lexer.CurrentPosition; Assert.AreEqual(2, pos.Line); Assert.AreEqual(3, pos.Col); }
[Test] public void LineBreak() { StructLexer lexer = new StructLexer("struct BITMAPINFOHEADER {\n}\n"); Assert.IsTrue(lexer.CheckNextToken(StructTokenType.String)); Assert.IsTrue(lexer.CheckNextToken(StructTokenType.String)); Assert.IsTrue(lexer.CheckNextToken(StructTokenType.OpenCurly)); Assert.IsTrue(lexer.CheckNextToken(StructTokenType.CloseCurly)); Assert.IsTrue(lexer.EndOfStream()); }
public void MultilineDelimitedString() { var lexer = new StructLexer("struct A { if (\na)"); Assert.IsTrue(lexer.CheckNextToken(StructTokenType.String)); Assert.IsTrue(lexer.CheckNextToken(StructTokenType.String)); Assert.IsTrue(lexer.CheckNextToken(StructTokenType.OpenCurly)); Assert.IsTrue(lexer.CheckNextToken(StructTokenType.String)); var token = lexer.GetNextToken(StructTokenType.String); Assert.AreEqual("\na", token); Assert.AreEqual(2, lexer.CurrentPosition.Line); }
public void MultilineAttributeValue() { var lexer = new StructLexer("[FileName=(a\nb)] struct A { }"); Assert.IsTrue(lexer.CheckNextToken(StructTokenType.OpenSquare)); Assert.IsTrue(lexer.CheckNextToken(StructTokenType.String)); Assert.IsTrue(lexer.CheckNextToken(StructTokenType.Equals)); TextPosition pos; var value = lexer.GetAttributeValue(out pos); Assert.AreEqual("(a\nb)", value); Assert.AreEqual(2, lexer.CurrentPosition.Line); }
[Test] public void LineAndCol() { StructLexer lexer = new StructLexer("struct A {\r\n u8"); Assert.IsTrue(lexer.CheckNextToken(StructTokenType.String)); Assert.IsTrue(lexer.CheckNextToken(StructTokenType.String)); Assert.IsTrue(lexer.CheckNextToken(StructTokenType.OpenCurly)); TextPosition pos = lexer.CurrentPosition; Assert.AreEqual(2, pos.Line); Assert.AreEqual(3, pos.Col); }
[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()); }
[Test] public void MultilineDelimitedString() { var lexer = new StructLexer("struct A { if (\na)"); Assert.IsTrue(lexer.CheckNextToken(StructTokenType.String)); Assert.IsTrue(lexer.CheckNextToken(StructTokenType.String)); Assert.IsTrue(lexer.CheckNextToken(StructTokenType.OpenCurly)); Assert.IsTrue(lexer.CheckNextToken(StructTokenType.String)); var token = lexer.GetNextToken(StructTokenType.String); Assert.AreEqual("\na", token); Assert.AreEqual(2, lexer.CurrentPosition.Line); }
[Test] public void MultilineAttributeValue() { var lexer = new StructLexer("[FileName=(a\nb)] struct A { }"); Assert.IsTrue(lexer.CheckNextToken(StructTokenType.OpenSquare)); Assert.IsTrue(lexer.CheckNextToken(StructTokenType.String)); Assert.IsTrue(lexer.CheckNextToken(StructTokenType.Equals)); TextPosition pos; var value = lexer.GetAttributeValue(out pos); Assert.AreEqual("(a\nb)", value); Assert.AreEqual(2, lexer.CurrentPosition.Line); }
[Test] public void ParenthesesDelimited() { StructLexer lexer = new StructLexer("struct (My (Best) Structure) { }"); Assert.IsTrue(lexer.CheckNextToken(StructTokenType.String)); Assert.AreEqual("My (Best) Structure", lexer.GetNextToken(StructTokenType.String)); }
[Test] public void QuoteDelimited() { StructLexer lexer = new StructLexer("struct \"My Structure\" { }"); Assert.IsTrue(lexer.CheckNextToken(StructTokenType.String)); Assert.AreEqual("My Structure", lexer.GetNextToken(StructTokenType.String)); }
[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); }
public void ParenthesesDelimited() { StructLexer lexer = new StructLexer("struct (My (Best) Structure) { }"); Assert.IsTrue(lexer.CheckNextToken(StructTokenType.String)); Assert.AreEqual("My (Best) Structure", lexer.GetNextToken(StructTokenType.String)); }
[Test] public void EndOfLineComments() { StructLexer lexer = new StructLexer("// comment\nstruct BITMAPINFOHEADER {\n}\n"); Assert.IsTrue(lexer.CheckNextToken(StructTokenType.String)); }
public void QuoteDelimited() { StructLexer lexer = new StructLexer("struct \"My Structure\" { }"); Assert.IsTrue(lexer.CheckNextToken(StructTokenType.String)); Assert.AreEqual("My Structure", lexer.GetNextToken(StructTokenType.String)); }
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()); }
public void EndOfLineComments() { StructLexer lexer = new StructLexer("// comment\nstruct BITMAPINFOHEADER {\n}\n"); Assert.IsTrue(lexer.CheckNextToken(StructTokenType.String)); }
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); }
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); }