• 大小: 22KB
    文件类型: .cpp
    金币: 2
    下载: 1 次
    发布日期: 2021-07-20
  • 语言: C/C++
  • 标签: 编译原理  

资源简介

广工编译原理实验 对PL/0作以下修改扩充: (1)修改单词:不等号# 改为 != ,只有!符号为非法单词。 (2)增加单词(只实现词法分析部分): 保留字 ELSE,RETURN,FOR,STEP,UNTIL 运算符 *=,/= (3)增加IF条件语句的ELSE子句(实现语法语义目标代码), 要求:写出相关文法,语法图,语义规则。 将我的Unit1.cpp文件覆盖掉你们的Unit1.cpp文件就可以

资源截图

代码片段和文件信息

/*** PL0 COMPILER WITH CODE GENERATION ***/
//---------------------------------------------------------------------------
#include 
#pragma hdrstop
#include “Unit1.h“
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource “*.dfm“
TForm1 *Form1;
//---------------------------------------------------------------------------
const  AL    =  10;  /* LENGTH OF IDENTIFIERS */
const  NORW  =  19;  /* # OF RESERVED WORDS */
const  TXMAX = 100;  /* LENGTH OF IDENTIFIER TABLE */
const  NMAX  =  14;  /* MAX NUMBER OF DEGITS IN NUMBERS */
const  AMAX  =2047;  /* MAXIMUM ADDRESS */
const  LEVMAX=   3;  /* MAX DEPTH OF BLOCK NESTING */
const  CXMAX = 200;  /* SIZE OF CODE ARRAY */

typedef enum  { NUL IDENT NUMBER PLUS MINUS TIMES
            SLASH ODDSYM EQL NEQ LSS LEQ GTR GEQ
            LPAREN RPAREN COMMA SEMICOLON PERIOD
            BECOMES BEGINSYM ENDSYM IFSYM THENSYM
            WHILESYM WRITESYM READSYM DOSYM CALLSYM
            CONSTSYM VARSYM PROCSYM PROGSYMELSESYMRETURNSYMFORSYMSTEPSYMUNTILSYMMULSYMDIVSYM
        } SYMBOL;
char *SYMOUT[] = {“NUL“ “IDENT“ “NUMBER“ “PLUS“ “MINUS“ “TIMES“
    “SLASH“ “ODDSYM“ “EQL“ “NEQ“ “LSS“ “LEQ“ “GTR“ “GEQ“
    “LPAREN“ “RPAREN“ “COMMA“ “SEMICOLON“ “PERIOD“
    “BECOMES“ “BEGINSYM“ “ENDSYM“ “IFSYM“ “THENSYM“
    “WHILESYM“ “WRITESYM“ “READSYM“ “DOSYM“ “CALLSYM“
    “CONSTSYM“ “VARSYM“ “PROCSYM“ “PROGSYM““ELSESYM““RETURNSYM““FORSYM““STEPSYM““UNTILSYM““MULSYM““DIVSYM“ };
typedef  int *SYMSET; // SET OF SYMBOL;
typedef  char ALFA[11];
typedef  enum { CONSTANT VARIABLE PROCEDUR } objectS ;
typedef  enum { LIT OPR LOD STO CAL INI JMP JPC } FCT;
typedef struct {
 FCT F;     /*FUNCTION CODE*/
 int L;  /*0..LEVMAX  LEVEL*/
 int A;     /*0..AMAX    DISPLACEMENT ADDR*/
} INSTRUCTION;
  /* LIT O A -- LOAD CONSTANT A             */
  /* OPR 0 A -- EXECUTE OPR A               */
  /* LOD L A -- LOAD VARIABLE LA           */
  /* STO L A -- STORE VARIABLE LA          */
  /* CAL L A -- CALL PROCEDURE A AT LEVEL L */
  /* INI 0 A -- INCREMET T-REGISTER BY A    */
  /* JMP 0 A -- JUMP TO A                   */
  /* JPC 0 A -- JUMP CONDITIONAL TO A       */
char   CH;  /*LAST CHAR READ*/
SYMBOL SYM; /*LAST SYMBOL READ*/
ALFA   ID;  /*LAST IDENTIFIER READ*/
int    NUM; /*LAST NUMBER READ*/
int    CC;  /*CHARACTER COUNT*/
int    LL;  /*LINE LENGTH*/
int    CX;  /*CODE ALLOCATION INDEX*/
char   LINE[81];
INSTRUCTION  CODE[CXMAX];
ALFA    KWORD[NORW+1];
SYMBOL  WSYM[NORW+1];
SYMBOL  SSYM[‘^‘+1];
ALFA    MNEMONIC[9];
SYMSET  DECLBEGSYS STATBEGSYS FACBEGSYS;

struct {
  ALFA NAME;
  objectS KIND;
  union {
    int VAL;   /*CONSTANT*/
    struct { int LEVELADRSIZE; } vp;  /*VARIABLEPROCEDUR:*/
  };
} TABLE[TXMAX];

FILE *FIN*FOUT;
int ERR;

void expression(SYMSET FSYS int LEV

评论

共有 条评论