| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- 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
- FileIO I/O library required *)
- 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.
|