Use SyntaxFacts to generate tokens for tests

This commit is contained in:
Alexander Luzgarev 2018-11-07 10:13:58 +01:00
parent 0f06f09187
commit 4a15e9dd72
2 changed files with 46 additions and 50 deletions

View File

@ -1,4 +1,5 @@
using Parser.Internal; using System;
using Parser.Internal;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using Xunit; using Xunit;
@ -24,12 +25,22 @@ namespace Parser.Tests
public static IEnumerable<object[]> SingleTokensData() public static IEnumerable<object[]> SingleTokensData()
{ {
return SingleTokens().Select(pair => new object[] { pair.kind, pair.text }); return GetTokens().Select(pair => new object[] { pair.kind, pair.text });
} }
public static IEnumerable<(TokenKind kind, string text)> SingleTokens() public static IEnumerable<(TokenKind kind, string text)> GetTokens()
{ {
return new[] var fixedTokens = Enum.GetValues(typeof(TokenKind))
.Cast<TokenKind>()
.Select(k => (kind: k, text: SyntaxFacts.GetText(k)))
.Where(t => !(t.text is null))
.Where(t => !(SyntaxFacts.IsUnaryTokenKind(t.kind)
|| SyntaxFacts.IsOpeningToken(t.kind)
|| SyntaxFacts.IsClosingToken(t.kind)
|| t.kind == TokenKind.Transpose));
var dynamicTokens = new[]
{ {
(TokenKind.Identifier, "a"), (TokenKind.Identifier, "a"),
(TokenKind.Identifier, "abc"), (TokenKind.Identifier, "abc"),
@ -39,44 +50,9 @@ namespace Parser.Tests
(TokenKind.NumberLiteral, "14.5e-3"), (TokenKind.NumberLiteral, "14.5e-3"),
(TokenKind.NumberLiteral, "3.14e8"), (TokenKind.NumberLiteral, "3.14e8"),
(TokenKind.StringLiteral, "'what is that'"), (TokenKind.StringLiteral, "'what is that'"),
(TokenKind.DoubleQuotedStringLiteral, "\"Another ' string\""), (TokenKind.DoubleQuotedStringLiteral, "\"Another ' string\"")
(TokenKind.Assignment, "="),
(TokenKind.Equality, "=="),
(TokenKind.Inequality, "~="),
(TokenKind.LogicalAnd, "&&"),
(TokenKind.LogicalOr, "||"),
(TokenKind.BitwiseAnd, "&"),
(TokenKind.BitwiseOr, "|"),
(TokenKind.Less, "<"),
(TokenKind.LessOrEqual, "<="),
(TokenKind.Greater, ">"),
(TokenKind.GreaterOrEqual, ">="),
(TokenKind.Not, "~"),
(TokenKind.Plus, "+"),
(TokenKind.Minus, "-"),
(TokenKind.Multiply, "*"),
(TokenKind.Divide, "/"),
(TokenKind.Power, "^"),
(TokenKind.Backslash, "\\"),
(TokenKind.DotMultiply, ".*"),
(TokenKind.DotDivide, "./"),
(TokenKind.DotPower, ".^"),
(TokenKind.DotBackslash, ".\\"),
(TokenKind.DotTranspose, ".'"),
(TokenKind.At, "@"),
(TokenKind.Colon, ":"),
(TokenKind.QuestionMark, "?"),
(TokenKind.Comma, ","),
(TokenKind.Semicolon, ";"),
//(TokenKind.OpeningBrace, "{"),
//(TokenKind.ClosingBrace, "}"),
//(TokenKind.OpeningSquareBracket, "["),
//(TokenKind.ClosingSquareBracket, "]"),
//(TokenKind.OpeningBracket, "("),
//(TokenKind.ClosingBracket, ")"),
(TokenKind.Dot, "."),
}; };
return fixedTokens.Concat(dynamicTokens);
} }
} }
} }

View File

@ -158,13 +158,14 @@ namespace Parser.Internal
private static readonly string[] StringFromKind = private static readonly string[] StringFromKind =
{ {
null, // None = 0, null, // None = 0,
"", // EndOfFile = 1, null, // BadToken = 1,
null, // Identifier = 2, null, // EndOfFile = 2,
null, // NumberLiteral = 3, null, // Identifier = 3,
null, // StringLiteral = 4, null, // NumberLiteral = 4,
null, // DoubleQuotedStringLiteral = 5, null, // StringLiteral = 5,
null, // UnquotedStringLiteral = 6 null, // DoubleQuotedStringLiteral = 6,
null, null, null, null, null, null, null, null, null, null, null, null, null, null, // UnquotedStringLiteral = 7
null, null, null, null, null, null, null, null, null, null, null, null,
"=", // Assignment = 20, "=", // Assignment = 20,
"==", // Equality = 21, "==", // Equality = 21,
"~=", // Inequality = 22, "~=", // Inequality = 22,
@ -201,7 +202,7 @@ namespace Parser.Internal
"(", // OpeningBracket = 53, "(", // OpeningBracket = 53,
")", // ClosingBracket = 54, ")", // ClosingBracket = 54,
".", // Dot = 55, ".", // Dot = 55,
"...", // DotDotDot = 56, null, // DotDotDot = 56, // This is not used at the moment.
"+", // UnaryPlus = 57, "+", // UnaryPlus = 57,
"-", // UnaryMinus = 58, "-", // UnaryMinus = 58,
@ -211,7 +212,12 @@ namespace Parser.Internal
public static string GetText(TokenKind kind) public static string GetText(TokenKind kind)
{ {
return StringFromKind[(int) kind]; if ((int) kind < (int) TokenKind.File)
{
return StringFromKind[(int) kind];
}
return null;
} }
public static bool IsUnaryOperator(TokenKind kind) public static bool IsUnaryOperator(TokenKind kind)
@ -228,6 +234,20 @@ namespace Parser.Internal
} }
} }
public static bool IsUnaryTokenKind(TokenKind kind)
{
switch (kind)
{
case TokenKind.UnaryPlus:
case TokenKind.UnaryMinus:
case TokenKind.UnaryNot:
case TokenKind.UnaryQuestionMark:
return true;
default:
return false;
}
}
public static bool IsBinaryOperator(TokenKind kind) public static bool IsBinaryOperator(TokenKind kind)
{ {
switch (kind) switch (kind)