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