| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546 |
- MODULE TAst;
- // Stage-A self-test for the AST module: build a small tree and walk it.
- // Prints "ok=<n>"; 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.
|