⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pretty.atg

📁 COCO類似C的編譯器
💻 ATG
字号:
/**********************************************************
**   PRETTY.ATG
**   Coco/R C Taste Pretty Printer Example.
**   Adapted to C++ by Frankie Arzu <farzu@uvg.edu.gt>
**      from Moessenboeck's (1990) Oberon example
**
**   May 24, 1996  Version 1.06
**   Oct 11, 1997  Version 1.07 (No change)
**   Mar 31, 1998  Version 1.08 (No change)
**********************************************************/

$C /* Generate main module */

COMPILER Pretty
/* Taste pretty printer */

#include <stdio.h>
#include "prettypr.h"
#include "prettys.h"

void WriteIdent()
{
    char IdentName[20];
    LexString(IdentName, sizeof(IdentName)-1);
    Append(IdentName);
}

void WriteNumber()
{
    char IdentName[20];
    LexString(IdentName, sizeof(IdentName)-1);
    Append(IdentName);
}

/*--------------------------------------------------------------------------*/

CHARACTERS
  letter = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".
  digit  = "0123456789".
  cr     = CHR(13).
  lf     = CHR(10).
  tab    = CHR(9).

TOKENS
  ident  = letter {letter | digit}.
  number = digit {digit}.

IGNORE cr + lf + tab

COMMENTS FROM "(*" TO "*)" NESTED

PRODUCTIONS
  Pretty =
   "PROGRAM"                        (. Append("PROGRAM "); .)
   Ident
    ";"                             (. Append(";"); IndentNextLine(); .)
   Body
   Ident
   "."                              (. Append("."); .) .

  Body =
    { "VAR"                         (. Append("VAR"); IndentNextLine(); .)
      { Ident
        ":"                         (. Append(" : "); .)
        TypeId
        ";"                         (. Append(";"); NewLine(); .)

      }                             (. ExdentNextLine(); .)

    | "PROCEDURE"                   (. NewLine(); Append("PROCEDURE "); .)
      Ident
      ";"                           (. Append(";"); IndentNextLine(); .)
      Body
      Ident
      ";"                           (. Append(";"); ExdentNextLine();
                                       NewLine(); .)

    }
    "BEGIN"                         (. Append("BEGIN"); .)
       StatSeq
    "END"                           (. Append("END "); .) .

  TypeId =  "INTEGER"               (. Append("INTEGER"); .)
           | "BOOLEAN"              (. Append("BOOLEAN"); .) .

  Ident = ident                     (. WriteIdent(); .) .

  StatSeq =                         (. IndentNextLine(); .)
            Stat {";"               (. Append(";"); NewLine(); .)
            Stat}                   (. ExdentNextLine(); .) .

  Stat
  = [ Ident
      ( ":="                        (. Append(" := "); .)
      Expression | )
    | "IF"                          (. Append("IF "); .)
      Expression
      "THEN"                        (. Append(" THEN "); .)
      StatSeq
      [ "ELSE"                      (. Append("ELSE "); .)
      StatSeq ]
      "END"                         (. Append("END"); .)
    | "WHILE"                       (. Append("WHILE "); .)
      Expression
      "DO"                          (. Append(" DO"); .)
      StatSeq
      "END"                         (. Append("END"); .)
    | "READ"                        (. Append("READ "); .)
      Ident
    | "WRITE"                       (. Append("WRITE "); .)
      Expression
    ] .

  Expression = SimExpr [ RelOp SimExpr ] .

  SimExpr = Term { AddOp Term } .

  Term = Factor { MulOp Factor } .

  Factor
      = ( Ident
          | "TRUE"                  (. Append("TRUE "); .)
          | "FALSE"                 (. Append("FALSE "); .)
          | number                  (. WriteNumber(); .)
          | "-"                     (. Append(" - "); .)
            Factor
        ) .

  MulOp =   "*"                     (. Append(" * "); .)
          | "/"                     (. Append(" / "); .)
          .

  AddOp =   "+"                     (. Append(" + "); .)
          | "-"                     (. Append(" - "); .)
          .

  RelOp =   "="                     (. Append(" = "); .)
          | "<"                     (. Append(" < "); .)
          | ">"                     (. Append(" > "); .)
          .

END Pretty.

⌨️ 快捷键说明

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