feat: 按照open_set中的示例调整语法 (#71)

添加了构建LR分析表冲突的报错

Reviewed-on: PostGuard/Canon#71
This commit is contained in:
2024-05-01 21:06:27 +08:00
parent feddbff205
commit 6130adfa7c
32 changed files with 1382 additions and 985 deletions

View File

@@ -7,7 +7,7 @@ namespace Canon.Tests.SemanticTests;
public class TypeCheckVisitorTests(ITestOutputHelper testOutputHelper)
{
private readonly TestLogger<TypeCheckVisitor> _logger = new(testOutputHelper);
private readonly TestLogger _logger = new(testOutputHelper);
[Fact]
public void ConstTypeTest()
@@ -549,6 +549,92 @@ public class TypeCheckVisitorTests(ITestOutputHelper testOutputHelper)
Assert.True(visitor.IsError);
}
[Fact]
public void TrueFalseTest()
{
const string program = """
program main;
var a : boolean;
begin
a := true;
a := false;
end.
""";
TypeCheckVisitor visitor = CheckType(program);
Assert.False(visitor.IsError);
}
[Fact]
public void NotTest()
{
const string program = """
program main;
var a: integer;
begin
a := 60;
write(not a);
end.
""";
TypeCheckVisitor visitor = CheckType(program);
Assert.False(visitor.IsError);
}
[Fact]
public void PascalFunctionTest()
{
const string program = """
program main;
var a : integer;
begin
write(a);
read(a);
writeln(a);
end.
""";
TypeCheckVisitor visitor = CheckType(program);
Assert.False(visitor.IsError);
}
[Fact]
public void FunctionCalculateTest()
{
const string program = """
program main;
var a : integer;
function test : integer;
begin
test := 1;
end;
begin
a := a + test;
end.
""";
TypeCheckVisitor visitor = CheckType(program);
Assert.False(visitor.IsError);
}
[Fact]
public void FunctionParameterCalculationTest()
{
const string program = """
program main;
var a : integer;
function test (p : integer) : integer;
begin
test := p;
end;
begin
a := 1 + test(1);
end.
""";
TypeCheckVisitor visitor = CheckType(program);
Assert.False(visitor.IsError);
}
private TypeCheckVisitor CheckType(string program)
{
ProgramStruct root = CompilerHelpers.Analyse(program);