isocdecl.atg 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. COMPILER Decl
  2. (* Translate simple C declarations into English
  3. Based on Kernighan and Ritchie: "C Programming language", page 122
  4. See also: Parr et.al. "PCCTS reference manual", page 53 in ACM SIGPLAN
  5. Notices 27(2), 88-165, 1992
  6. ISO I/O library required *)
  7. IMPORT SWholeIO, STextIO;
  8. PROCEDURE GetNumber (VAR C : CARDINAL);
  9. VAR
  10. I : CARDINAL;
  11. String : ARRAY [0 .. 20] OF CHAR;
  12. BEGIN
  13. LexString(String);
  14. I := 0; C := 0;
  15. WHILE String[I] # 0C DO
  16. C := 10 * C + ORD(String[I]) - ORD('0'); INC(I)
  17. END;
  18. END GetNumber;
  19. VAR
  20. Name, Tipe : ARRAY [0 .. 20] OF CHAR;
  21. Size : CARDINAL;
  22. CHARACTERS
  23. digit = "0123456789" .
  24. letter = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyx_" .
  25. IGNORE CHR(1) .. CHR(31)
  26. TOKENS
  27. number = digit { digit } .
  28. name = letter { letter } .
  29. PRODUCTIONS
  30. Decl = { name (. LexName(Tipe) .)
  31. Dcl (. STextIO.WriteChar(' ');
  32. STextIO.WriteString(Tipe);
  33. STextIO.WriteLn .)
  34. ";" } .
  35. Dcl = "*" Dcl (. STextIO.WriteString(' pointer to') .)
  36. | DirectDcl .
  37. DirectDcl = name (. LexName(Name);
  38. STextIO.WriteChar(' ');
  39. STextIO.WriteString(Name);
  40. STextIO.WriteString(' is') .)
  41. Descriptor
  42. | "(" Dcl ")" Descriptor .
  43. Descriptor = [ "[" (. STextIO.WriteString(' array ') .)
  44. ( number (. GetNumber(Size);
  45. STextIO.WriteChar('[');
  46. SWholeIO.WriteCard(Size, 1);
  47. STextIO.WriteString('] ') .)
  48. | (* no dimension *)
  49. )
  50. "]" (. STextIO.WriteString('of') .)
  51. Descriptor
  52. | "(" ")" (. STextIO.WriteString(' function returning') .)
  53. ] .
  54. END Decl.