isocdecl.atg

来自「一个Modula-2语言分析器」· ATG 代码 · 共 67 行

ATG
67
字号
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
   ISO I/O library required *)

IMPORT SWholeIO, STextIO;

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                           (. STextIO.WriteChar(' ');
                                            STextIO.WriteString(Tipe);
                                            STextIO.WriteLn .)
           ";" } .

  Dcl =     "*" Dcl                      (. STextIO.WriteString(' pointer to') .)
           | DirectDcl .

  DirectDcl =   name                     (. LexName(Name);
                                            STextIO.WriteChar(' ');
                                            STextIO.WriteString(Name);
                                            STextIO.WriteString(' is') .)
                Descriptor
              | "(" Dcl ")" Descriptor .

  Descriptor = [  "["                    (. STextIO.WriteString(' array ') .)
                  ( number               (. GetNumber(Size);
                                            STextIO.WriteChar('[');
                                            SWholeIO.WriteCard(Size, 1);
                                            STextIO.WriteString('] ') .)
                    | (* no dimension *)
                  )
                  "]"                    (. STextIO.WriteString('of') .)
                  Descriptor
                | "(" ")"                (. STextIO.WriteString(' function returning') .)
               ] .

END Decl.

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?