add: Array declaration and variable indexer.
This commit is contained in:
@@ -41,15 +41,52 @@ public sealed class ExpressionParserTests : GrammarParserTestBase
|
||||
[Fact]
|
||||
public void IdentifierTest()
|
||||
{
|
||||
VariableNode node = RunParser<VariableNode>(GrammarParser.FactorParser(), "temp");
|
||||
Assert.Equal("temp", node.IdentifierName);
|
||||
VariableNode node = RunParser<VariableNode>(GrammarParser.VariableParser(), "temp");
|
||||
Assert.Equal("temp", node.Identifier.LiteralValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ArrayIdentifierTest()
|
||||
{
|
||||
VariableNode node = RunParser<VariableNode>(GrammarParser.VariableParser(), "a[0]");
|
||||
Assert.Equal("a", node.Identifier.LiteralValue);
|
||||
Assert.Single(node.Indexers);
|
||||
Assert.Equal(0, node.Indexers.First().Convert<IntegerValueNode>().Value);
|
||||
|
||||
node = RunParser<VariableNode>(GrammarParser.VariableParser(), "a[i + 1]");
|
||||
Assert.Equal("a", node.Identifier.LiteralValue);
|
||||
Assert.Single(node.Indexers);
|
||||
BinaryOperatorNode binaryOperatorNode = node.Indexers.First().Convert<BinaryOperatorNode>();
|
||||
Assert.Equal(BinaryOperatorType.Add, binaryOperatorNode.OperatorType);
|
||||
Assert.Equal("i", binaryOperatorNode.Left.Convert<VariableNode>().Identifier.LiteralValue);
|
||||
Assert.Equal(1, binaryOperatorNode.Right.Convert<IntegerValueNode>().Value);
|
||||
|
||||
node = RunParser<VariableNode>(GrammarParser.VariableParser(), "a[b[i + 1] - 10, c]");
|
||||
Assert.Equal("a", node.Identifier.LiteralValue);
|
||||
Assert.Equal(2, node.Indexers.Count);
|
||||
|
||||
VariableNode secondNode = node.Indexers[1].Convert<VariableNode>();
|
||||
Assert.Equal("c", secondNode.Identifier.LiteralValue);
|
||||
Assert.Empty(secondNode.Indexers);
|
||||
|
||||
BinaryOperatorNode firstNode = node.Indexers[0].Convert<BinaryOperatorNode>();
|
||||
Assert.Equal(BinaryOperatorType.Subtract, firstNode.OperatorType);
|
||||
Assert.Equal(10, firstNode.Right.Convert<IntegerValueNode>().Value);
|
||||
|
||||
VariableNode variableNode = firstNode.Left.Convert<VariableNode>();
|
||||
Assert.Equal("b", variableNode.Identifier.LiteralValue);
|
||||
Assert.Single(variableNode.Indexers);
|
||||
binaryOperatorNode = variableNode.Indexers[0].Convert<BinaryOperatorNode>();
|
||||
Assert.Equal(BinaryOperatorType.Add, binaryOperatorNode.OperatorType);
|
||||
Assert.Equal("i", binaryOperatorNode.Left.Convert<VariableNode>().Identifier.LiteralValue);
|
||||
Assert.Equal(1, binaryOperatorNode.Right.Convert<IntegerValueNode>().Value);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void SingleTermTest()
|
||||
{
|
||||
VariableNode node = RunParser<VariableNode>(GrammarParser.TermParser(), "temp");
|
||||
Assert.Equal("temp", node.IdentifierName);
|
||||
Assert.Equal("temp", node.Identifier.LiteralValue);
|
||||
|
||||
UnaryOperatorNode unaryOperatorNode = RunParser<UnaryOperatorNode>(GrammarParser.TermParser(), "- 123");
|
||||
Assert.Equal(UnaryOperatorType.Minus, unaryOperatorNode.OperatorType);
|
||||
@@ -89,7 +126,7 @@ public sealed class ExpressionParserTests : GrammarParserTestBase
|
||||
Assert.Equal(3, node.Right.Convert<IntegerValueNode>().Value);
|
||||
BinaryOperatorNode leftNode = node.Left.Convert<BinaryOperatorNode>();
|
||||
Assert.Equal(BinaryOperatorType.Multiply, leftNode.OperatorType);
|
||||
Assert.Equal("temp", leftNode.Left.Convert<VariableNode>().IdentifierName);
|
||||
Assert.Equal("temp", leftNode.Left.Convert<VariableNode>().Identifier.LiteralValue);
|
||||
Assert.Equal(2, leftNode.Right.Convert<IntegerValueNode>().Value);
|
||||
}
|
||||
|
||||
@@ -97,7 +134,7 @@ public sealed class ExpressionParserTests : GrammarParserTestBase
|
||||
public void SimpleExpressionTest1()
|
||||
{
|
||||
VariableNode node = RunParser<VariableNode>(GrammarParser.SimpleExpressionParser(), "temp");
|
||||
Assert.Equal("temp", node.IdentifierName);
|
||||
Assert.Equal("temp", node.Identifier.LiteralValue);
|
||||
|
||||
UnaryOperatorNode unaryOperatorNode =
|
||||
RunParser<UnaryOperatorNode>(GrammarParser.SimpleExpressionParser(), "- 123");
|
||||
@@ -238,8 +275,6 @@ public sealed class ExpressionParserTests : GrammarParserTestBase
|
||||
public void VariableTest1()
|
||||
{
|
||||
VariableNode node = RunParser<VariableNode>(GrammarParser.VariableParser(), "temp");
|
||||
Assert.Equal("temp", node.IdentifierName);
|
||||
Assert.Equal("temp", node.Identifier.LiteralValue);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
@@ -31,7 +31,7 @@ public class ProgramParserTests : GrammarParserTestBase
|
||||
Assert.Equal("main", program.Head.ProgramName.LiteralValue);
|
||||
|
||||
AssignNode assignNode = program.Body.MainBlock.Statements[0].Convert<AssignNode>();
|
||||
Assert.Equal("temp", assignNode.Variable.IdentifierName);
|
||||
Assert.Equal("temp", assignNode.Variable.Identifier.LiteralValue);
|
||||
|
||||
BinaryOperatorNode binaryOperatorNode = assignNode.Expression.Convert<BinaryOperatorNode>();
|
||||
Assert.Equal(BinaryOperatorType.Add, binaryOperatorNode.OperatorType);
|
||||
@@ -59,7 +59,7 @@ public class ProgramParserTests : GrammarParserTestBase
|
||||
Assert.Equal("b", constantNodes[1].Identifier.LiteralValue);
|
||||
|
||||
AssignNode assignNode = program.Body.MainBlock.Statements[0].Convert<AssignNode>();
|
||||
Assert.Equal("temp", assignNode.Variable.IdentifierName);
|
||||
Assert.Equal("temp", assignNode.Variable.Identifier.LiteralValue);
|
||||
|
||||
BinaryOperatorNode binaryOperatorNode = assignNode.Expression.Convert<BinaryOperatorNode>();
|
||||
Assert.Equal(BinaryOperatorType.Add, binaryOperatorNode.OperatorType);
|
||||
@@ -124,6 +124,20 @@ public class ProgramParserTests : GrammarParserTestBase
|
||||
d := false;
|
||||
end.
|
||||
""")]
|
||||
[InlineData("""
|
||||
program arrayTest;
|
||||
var a : array [0..10] of integer;
|
||||
begin
|
||||
a[0] := 1;
|
||||
end.
|
||||
""")]
|
||||
[InlineData("""
|
||||
program arrayTest;
|
||||
var a : array [10..100, 0..10] of integer;
|
||||
begin
|
||||
a[10,0] := 1;
|
||||
end.
|
||||
""")]
|
||||
public void ProgramParseTest(string input)
|
||||
{
|
||||
ProgramParse(input);
|
||||
|
@@ -11,7 +11,7 @@ public class StatementParserTests : GrammarParserTestBase
|
||||
{
|
||||
AssignNode node = RunParser<AssignNode>(GrammarParser.StatementParser(), "temp := 1");
|
||||
|
||||
Assert.Equal("temp", node.Variable.IdentifierName);
|
||||
Assert.Equal("temp", node.Variable.Identifier.LiteralValue);
|
||||
Assert.Equal(1, node.Expression.Convert<IntegerValueNode>().Value);
|
||||
}
|
||||
|
||||
@@ -34,10 +34,10 @@ public class StatementParserTests : GrammarParserTestBase
|
||||
|
||||
Assert.Equal(2, node.Statements.Count);
|
||||
AssignNode assignNode = node.Statements[0].Convert<AssignNode>();
|
||||
Assert.Equal("temp", assignNode.Variable.IdentifierName);
|
||||
Assert.Equal("temp", assignNode.Variable.Identifier.LiteralValue);
|
||||
|
||||
assignNode = node.Statements[1].Convert<AssignNode>();
|
||||
Assert.Equal("flag", assignNode.Variable.IdentifierName);
|
||||
Assert.Equal("flag", assignNode.Variable.Identifier.LiteralValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
@@ -74,9 +74,9 @@ public class StatementParserTests : GrammarParserTestBase
|
||||
|
||||
Assert.Equal(2, node.Statements.Count);
|
||||
AssignNode assignNode = node.Statements[0].Convert<AssignNode>();
|
||||
Assert.Equal("temp", assignNode.Variable.IdentifierName);
|
||||
Assert.Equal("temp", assignNode.Variable.Identifier.LiteralValue);
|
||||
|
||||
assignNode = node.Statements[1].Convert<AssignNode>();
|
||||
Assert.Equal("flag", assignNode.Variable.IdentifierName);
|
||||
Assert.Equal("flag", assignNode.Variable.Identifier.LiteralValue);
|
||||
}
|
||||
}
|
||||
|
@@ -11,12 +11,28 @@ public class VariableDeclarationTests : GrammarParserTestBase
|
||||
[InlineData("integer", "integer")]
|
||||
[InlineData("char", "char")]
|
||||
[InlineData("real", "real")]
|
||||
public void TypeParseTest(string input, string value)
|
||||
public void BasicTypeParseTest(string input, string value)
|
||||
{
|
||||
TypeNode node = RunParser<TypeNode>(GrammarParser.TypeParser(), input);
|
||||
Assert.Equal(value, node.TypeToken.LiteralValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ArrayTypeParseTest()
|
||||
{
|
||||
TypeNode node = RunParser<TypeNode>(GrammarParser.ArrayTypeParser(), "array [0..9] of integer");
|
||||
|
||||
Assert.Equal("integer", node.TypeToken.LiteralValue);
|
||||
Assert.Single(node.ArrayRanges);
|
||||
Assert.Equal(new ArrayRange(0, 9), node.ArrayRanges.First());
|
||||
|
||||
node = RunParser<TypeNode>(GrammarParser.ArrayTypeParser(), "array [0..10,0..10] of char");
|
||||
Assert.Equal("char", node.TypeToken.LiteralValue);
|
||||
Assert.Equal(2, node.ArrayRanges.Count);
|
||||
Assert.Equal(new ArrayRange(0, 10), node.ArrayRanges[0]);
|
||||
Assert.Equal(new ArrayRange(0, 10), node.ArrayRanges[1]);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void VariableDeclarationTest()
|
||||
{
|
||||
@@ -35,12 +51,29 @@ public class VariableDeclarationTests : GrammarParserTestBase
|
||||
Assert.Equal("boolean", node.TypeNode.TypeToken.LiteralValue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ArrayVariableDeclarationTest()
|
||||
{
|
||||
VariableDeclarationNode node = RunParser<VariableDeclarationNode>(GrammarParser.VariableDeclarationParser(),
|
||||
"test_array: array [0..9,10..20] of real");
|
||||
|
||||
Assert.Single(node.Identifiers);
|
||||
Assert.Contains(node.Identifiers, token => token.LiteralValue == "test_array");
|
||||
Assert.Equal("real", node.TypeNode.TypeToken.LiteralValue);
|
||||
|
||||
Assert.Equal(2, node.TypeNode.ArrayRanges.Count);
|
||||
Assert.Equal(new ArrayRange(0, 9), node.TypeNode.ArrayRanges[0]);
|
||||
Assert.Equal(new ArrayRange(10, 20), node.TypeNode.ArrayRanges[1]);
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[InlineData("var a : integer;", 1)]
|
||||
[InlineData("var a : integer; b : boolean;", 2)]
|
||||
[InlineData("var a : integer; b,c : boolean;" +
|
||||
"d : char", 3)]
|
||||
[InlineData("var a,d,e : integer; b : boolean; c: real;", 3)]
|
||||
[InlineData("var a : array [0..5] of integer", 1)]
|
||||
[InlineData("var a,b,c: array [0..9,10..20] of integer; c,d : boolean", 2)]
|
||||
public void VariableDeclarationsTest(string input, int count)
|
||||
{
|
||||
BlockNode node = RunParser<BlockNode>(GrammarParser.VariableDeclarationsParser(), input);
|
||||
|
Reference in New Issue
Block a user