?? main.cpp
字號:
/****************************************************/
/* 文件 main.cpp */
/* 說明 類PASCAL語言編譯器主程序 */
/* 主題 編譯器結構:原理和實例 */
/****************************************************/
/* 頭文件globals.h定義了全局類型與變量 */
#include "globals.h"
/*頭文件scan.h定義了詞法分析程序的界面*/
#include "scanner.h"
/*頭文件util.h定義了語法分析程序的界面*/
#include "util.h"
#include "symbTable.h"
#include "string.h"
/*************************************************************/
/* 條件編譯處理 */
/* 且如果NO_DIRECT_DESTCODE為FALSE,NO_MIDCODE、NO_CONSOPTI、*/
/* NO_ECCOPTI、NO_LOOPOPTI、NO_DESTCODE均不能為FALSE */
/*************************************************************/
/* 設置語法分析條件編譯標志NO_PARSE為FALSE, *
* 如果為TRUE,則得到一個只有詞法掃描功能的編譯器 */
#define NO_PARSE FALSE
#if !NO_PARSE
#endif
#include "parse.h"
#if !NO_ANALYZE
/* 條件編譯,聯入頭文件zanalyze.h,該頭文件定義了語義解析器界面 */
#include "analyze.h"
#endif
/*******************全局變量*******************/
FILE * source; /* 源程序文本文件,為編譯器輸入文件 */
FILE * listing; /* 中間列表文件,為編譯器中間信息輸出文件 */
/*指針fp,指向存放Token序列的文件"Tokenlist"*/
FILE *fp;
/*Token序列中的token數目*/
int Tokennum=0;
/*清單的行號*/
int lineno=0;
/*記錄當前層的displayOff*/
int savedOff = 0;
/*保存主程序的display表的偏移*/
int StoreNoff ;
/********** 設置追蹤標志初始值 **********/
/* 源代碼文件追蹤標志,初始為FALSE.如果為TRUE, *
* 將源代碼信息輸出到中間文件listing *
* 在zscanner.cpp文件的函數getNextChar()中,實現輸出 */
int EchoSource = TRUE;
/* 詞法分析追蹤標志,初始為FALSE.如果為TRUE, *
* 將詞法分析信息輸出到中間文件listing */
int TraceScan = FALSE;
/* 語法分析追蹤標志,初始為FALSE.如果為TRUE, *
* 將語法分析信息輸出到中間文件listing */
int TraceParse = TRUE;
/* 符號表輸出標志,初始為FALSE.如果為TRUE, *
* 將語義分析時產生的符號表信息輸出到中間文件 *
* listing */
int TraceTable = TRUE ;
/*錯誤追蹤標識,防止錯誤的進一步傳遞*/
int Error = FALSE;
/********************************************************/
/* 函數名 main */
/* 功 能 函數將編譯程序中各個功能部分有機結合在一起, */
/* 完成用戶需要的編譯工作,輸出相關信息和結果 */
/* 說 明 函數參數argc指明參數個數,參數argv記錄參字串 */
/* 用戶應給定要編譯的源程序文件目錄名為調用參數 */
/********************************************************/
main( )
{
/*輸入要編譯的文件名*/
char pgm[120];
printf("input program names:\n");
scanf("%s",pgm);
/* 若未指定文件擴展名,給源文件加上擴展名.tny */
if (strchr (pgm, '.') == NULL)
strcat(pgm,".tny");
/* 用只讀方式打開源程序文件pgm,文件指針給source */
source = fopen(pgm,"r");
if (source==NULL)
{
fprintf(stderr,"File %s not found\n",pgm);
exit(1);
}
/* 將中間信息列表文件listing指向屏幕標準輸出stdout */
listing = stdout;
/* 輸出中間編譯信息 */
fprintf(listing,"\nTINY COMPILATION: %s\n",pgm);
/* 調用詞法分析函數,得到Token序列*/
getTokenlist();
if (EchoSource)
{ /*按鍵進入下一部分*/
getchar();
getchar();
}
/* 如果詞法分析追蹤標志為TRUE,則將生成的Token序列輸出到屏幕 */
if (TraceScan)
{
fprintf(listing,"\n詞法分析:\n");
//fprintf(testing,"\nLexical analysizing:\n");
fprintf(listing,"\ntoken list:\n");
printTokenlist();
getchar();
}
/*********************************/
/* 條件編譯處理,選擇語法分析部分 */
/*********************************/
/* 條件編譯,如果!NO_PARSE為FALSE, *
/* 得到一個只有詞法掃描功能的編譯器,*
/* 否則進行語法分析 */
#if !NO_PARSE
TreeNode * syntaxTree;
fprintf(listing,"\n遞歸下降語法分析:\n");
syntaxTree = parse();
/* 如果語法分析追蹤標志為TRUE且沒有語法錯誤,
則將生成的語法樹輸出到屏幕 */
if ((TraceParse)&&(!Error))
{
fprintf(listing,"\n語法樹:\n\n");
printTree(syntaxTree);
getchar();
}
/*********************************/
/* 條件編譯處理,選擇語義分析部分 */
/*********************************/
/*條件編譯,當!NO_ANALYZE為真,且前面的分析沒有錯誤,
則進行下面的語義分析*/
#if !NO_ANALYZE
{
fprintf(listing ,"\n詞法分析:\n");
fprintf(listing ,"檢查詞法信息r......\n");
/*語義分析*/
analyze(syntaxTree);
if (!Error)
fprintf(listing ," \n正確 !\n");
/*輸出符號表*/
if ((TraceTable)&&(!Error))
{
fprintf(listing ,"\n以下輸出語法樹.....\n");
PrintSymbTable();
getchar();
getchar();
}
/*輸出含符號表信息的語法樹*/
if ((TraceParse)&&(!Error))
{
fprintf(listing,"語法分析完畢 ..");
fprintf(listing,"\n語法錯誤:\n\n");
printTree(syntaxTree);
getchar( );
}
}
#endif//結束NO_ANALYZE的條件編譯
#endif//結束NO_PARSE的條件編譯
getchar();
fprintf(listing,"\n以下開始釋放空間 ........\n");
getchar();
/*釋放語法樹空間*/
if (syntaxTree!=NULL)
{ freeTree(syntaxTree);
fprintf(listing,">>釋放語法樹\n");
}
/*釋放符號表空間*/
freeTable();
fprintf(listing, ">>釋放符號表\n ");
/* 編譯結束,關閉源程序文件source */
fclose(source);
/* 編譯成功,程序正常返回 */
return 0;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -