File: cdecl.atg

package info (click to toggle)
pm3 1.1.15-1
  • links: PTS
  • area: main
  • in suites: woody
  • size: 140,404 kB
  • ctags: 106,859
  • sloc: ansic: 891,434; modula3: 550,649; exp: 18,409; sh: 16,930; lisp: 13,693; makefile: 13,271; asm: 11,795; cpp: 5,560; yacc: 5,125; sed: 1,047; csh: 254; awk: 223; pascal: 95; fortran: 5
file content (63 lines) | stat: -rw-r--r-- 2,316 bytes parent folder | download | duplicates (2)
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.