fix:修改对递归函数的procedureCall类型检查,在父符号表中寻找id (#66)

Reviewed-on: PostGuard/Canon#66
Co-authored-by: ichirinko <1621543655@qq.com>
Co-committed-by: ichirinko <1621543655@qq.com>
This commit is contained in:
ichirinko
2024-04-29 21:33:09 +08:00
committed by jackfiled
parent 03852ed2bf
commit 4d325569fa
3 changed files with 83 additions and 8 deletions

View File

@@ -426,7 +426,7 @@ public class TypeCheckVisitorTests(ITestOutputHelper testOutputHelper)
end;
begin
findMin(a, b, c,error);
findmin(a, b, c,error);
(* Procedure call *)
end.
""";
@@ -436,6 +436,32 @@ public class TypeCheckVisitorTests(ITestOutputHelper testOutputHelper)
}
[Fact]
public void RecursionProcedureCallTest()
{
const string program = """
program main;
var a, b:integer; c:real;
function Test0(var a1:integer; b1:integer; c1:real):integer;
begin
test0(a1,b1,c1+0.5);
end;
function Test1(var a1:integer; b1:integer; c1:real):integer;
begin
test0(1,1,1.0);
end;
begin
teSt1(a,b,1.02);
test(a, b, c);
end.
""";
TypeCheckVisitor visitor = CheckType(program);
Assert.True(visitor.IsError);
}
[Fact]
public void ArrayAssignIndexTest()
{
@@ -506,6 +532,23 @@ public class TypeCheckVisitorTests(ITestOutputHelper testOutputHelper)
CheckType(program);
}
[Fact]
public void BooleanOperatorTest()
{
const string program = """
program main;
var flag, tag : boolean;
error:integer;
begin
tag := flag or tag;
flag := flag and error;
end.
""";
TypeCheckVisitor visitor = CheckType(program);
Assert.True(visitor.IsError);
}
private TypeCheckVisitor CheckType(string program)
{
ProgramStruct root = CompilerHelpers.Analyse(program);