MODULE TAst; // Stage-A self-test for the AST module: build a small tree and walk it. // Prints "ok="; exit 42 when all 10 checks pass. IMPORT AST, FileIO; VAR ExitCode : INTEGER; VAR root, e1, e2, e3 : AST.Node; VAR s : ARRAY [0..63] OF CHAR; VAR ok : INTEGER; BEGIN ok := 0; AST.Init; e2 := AST.MakeLeaf(AST.NkIdent, "b"); e3 := AST.MakeLeaf(AST.NkIntLit, "2"); e1 := AST.MakeBin(AST.NkBinExpr, AST.OpAdd, e2, e3); root := AST.MakeBin(AST.NkAssign, 0, AST.MakeLeaf(AST.NkIdent, "a"), e1); IF AST.Kind(root) = AST.NkAssign THEN INC(ok) END; IF AST.NChild(root) = 2 THEN INC(ok) END; IF AST.Kind(AST.Child(root, 0)) = AST.NkIdent THEN INC(ok) END; IF AST.Kind(AST.Child(root, 1)) = AST.NkBinExpr THEN INC(ok) END; IF AST.Op(AST.Child(root, 1)) = AST.OpAdd THEN INC(ok) END; IF AST.Kind(AST.Child(AST.Child(root, 1), 1)) = AST.NkIntLit THEN INC(ok) END; AST.Txt(AST.Child(AST.Child(root, 0), 0), s); IF s[0] = "a" THEN INC(ok) END; IF AST.AddTxt("b") = AST.AddTxt("b") THEN INC(ok) END; e1 := AST.MakeUn(AST.NkUnary, AST.OpSub, AST.MakeLeaf(AST.NkIntLit, "1")); root := AST.MakeNode(AST.NkBlock); IF AST.AddChild(root, e1) THEN INC(ok) END; IF AST.AddChild(root, e2) THEN INC(ok) END; IF AST.NChild(root) = 2 THEN INC(ok) END; FileIO.WriteString(FileIO.StdOut, "ok="); FileIO.WriteInt(FileIO.StdOut, ok, 1); FileIO.WriteLn(FileIO.StdOut); IF ok = 11 THEN ExitCode := 42 ELSE ExitCode := ok END END TAst.