cdecl.atg 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  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. FileIO I/O library required *)
  7. PROCEDURE GetNumber (VAR C : CARDINAL);
  8. VAR
  9. I : CARDINAL;
  10. String : ARRAY [0 .. 20] OF CHAR;
  11. BEGIN
  12. LexString(String);
  13. I := 0; C := 0;
  14. WHILE String[I] # 0C DO
  15. C := 10 * C + ORD(String[I]) - ORD('0'); INC(I)
  16. END;
  17. END GetNumber;
  18. VAR
  19. Name, Tipe : ARRAY [0 .. 20] OF CHAR;
  20. Size : CARDINAL;
  21. CHARACTERS
  22. digit = "0123456789" .
  23. letter = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyx_" .
  24. IGNORE CHR(1) .. CHR(31)
  25. TOKENS
  26. number = digit { digit } .
  27. name = letter { letter } .
  28. PRODUCTIONS
  29. Decl = { name (. LexName(Tipe) .)
  30. Dcl (. FileIO.Write(FileIO.StdOut, ' ');
  31. FileIO.WriteString(FileIO.StdOut, Tipe);
  32. FileIO.WriteLn(FileIO.StdOut) .)
  33. ";" } .
  34. Dcl = "*" Dcl (. FileIO.WriteString(FileIO.StdOut, ' pointer to') .)
  35. | DirectDcl .
  36. DirectDcl = name (. LexName(Name);
  37. FileIO.Write(FileIO.StdOut, ' ');
  38. FileIO.WriteString(FileIO.StdOut, Name);
  39. FileIO.WriteString(FileIO.StdOut, ' is') .)
  40. Descriptor
  41. | "(" Dcl ")" Descriptor .
  42. Descriptor = [ "[" (. FileIO.WriteString(FileIO.StdOut, ' array ') .)
  43. ( number (. GetNumber(Size);
  44. FileIO.Write(FileIO.StdOut, '[');
  45. FileIO.WriteCard(FileIO.StdOut, Size, 1);
  46. FileIO.WriteString(FileIO.StdOut, '] ') .)
  47. | (* no dimension *)
  48. )
  49. "]" (. FileIO.WriteString(FileIO.StdOut, 'of') .)
  50. Descriptor
  51. | "(" ")" (. FileIO.WriteString(FileIO.StdOut, ' function returning') .)
  52. ] .
  53. END Decl.