M2c.atg 1.2 KB

123456789101112131415161718192021222324252627282930313233343536
  1. COMPILER M2c
  2. (* Phase 0: module skeleton only.
  3. Accepts "MODULE <name> ; [ BEGIN ] END <name> ." and checks that
  4. the closing name matches (error 202). No declarations, no
  5. statements, no symbol table yet — those arrive in Phase 1. *)
  6. CHARACTERS
  7. letter = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" .
  8. digit = "0123456789" .
  9. IGNORE CHR(9) .. CHR(13)
  10. COMMENTS
  11. FROM "(*" TO "*)" NESTED
  12. TOKENS
  13. ident = letter { letter | digit } .
  14. PRODUCTIONS
  15. M2c (. VAR m1, m2: ARRAY [0 .. 63] OF CHAR;
  16. i: CARDINAL; same: BOOLEAN; .)
  17. = "MODULE" ident (. LexName(m1); .)
  18. ";" [ "BEGIN" ] "END"
  19. ident (. LexName(m2);
  20. i := 0; same := TRUE;
  21. WHILE same & ((m1[i] # 0C)
  22. OR (m2[i] # 0C)) DO
  23. IF m1[i] # m2[i] THEN
  24. same := FALSE
  25. END;
  26. INC(i)
  27. END;
  28. IF ~same THEN SemError(202) END; .)
  29. "." .
  30. END M2c.