t_ast.mod 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. MODULE TAst;
  2. // Stage-A self-test for the AST module: build a small tree and walk it.
  3. // Prints "ok=<n>"; exit 42 when all 10 checks pass.
  4. IMPORT AST, FileIO;
  5. VAR ExitCode : INTEGER;
  6. VAR root, e1, e2, e3 : AST.Node;
  7. VAR s : ARRAY [0..63] OF CHAR;
  8. VAR ok : INTEGER;
  9. BEGIN
  10. ok := 0;
  11. AST.Init;
  12. e2 := AST.MakeLeaf(AST.NkIdent, "b");
  13. e3 := AST.MakeLeaf(AST.NkIntLit, "2");
  14. e1 := AST.MakeBin(AST.NkBinExpr, AST.OpAdd, e2, e3);
  15. root := AST.MakeBin(AST.NkAssign, 0,
  16. AST.MakeLeaf(AST.NkIdent, "a"), e1);
  17. IF AST.Kind(root) = AST.NkAssign THEN INC(ok) END;
  18. IF AST.NChild(root) = 2 THEN INC(ok) END;
  19. IF AST.Kind(AST.Child(root, 0)) = AST.NkIdent THEN INC(ok) END;
  20. IF AST.Kind(AST.Child(root, 1)) = AST.NkBinExpr THEN INC(ok) END;
  21. IF AST.Op(AST.Child(root, 1)) = AST.OpAdd THEN INC(ok) END;
  22. IF AST.Kind(AST.Child(AST.Child(root, 1), 1)) = AST.NkIntLit THEN
  23. INC(ok)
  24. END;
  25. AST.Txt(AST.Child(AST.Child(root, 0), 0), s);
  26. IF s[0] = "a" THEN INC(ok) END;
  27. IF AST.AddTxt("b") = AST.AddTxt("b") THEN INC(ok) END;
  28. e1 := AST.MakeUn(AST.NkUnary, AST.OpSub,
  29. AST.MakeLeaf(AST.NkIntLit, "1"));
  30. root := AST.MakeNode(AST.NkBlock);
  31. IF AST.AddChild(root, e1) THEN INC(ok) END;
  32. IF AST.AddChild(root, e2) THEN INC(ok) END;
  33. IF AST.NChild(root) = 2 THEN INC(ok) END;
  34. FileIO.WriteString(FileIO.StdOut, "ok=");
  35. FileIO.WriteInt(FileIO.StdOut, ok, 1);
  36. FileIO.WriteLn(FileIO.StdOut);
  37. IF ok = 11 THEN ExitCode := 42 ELSE ExitCode := ok END
  38. END TAst.