?? commandline.cpp
字號(hào):
/******************************************************************
** 文件名: CommandLine.cpp
** 描 述: 通過兩個(gè)類(類的聲明在Commcanline.h中)完成命令行參數(shù)的處理。包括:
** v: 顯示版本信息。
** ?: 使用幫助。
** S: 進(jìn)行源程序掃描后就結(jié)束
** p: 執(zhí)行語法分析后結(jié)束
** A: 執(zhí)行語義分析后結(jié)束。
** C: 產(chǎn)生實(shí)際的80X86匯編代碼。
** 命令行使用示例: hc/v 顯示版本信息。
** hc/c filein.c fileout.asm 編譯生成匯編代碼文件。
******************************************************************/
#include "globals.h"
#include "CommandLine.h"
/****************************************************
**編譯過程中用到的所有簡(jiǎn)單全局變量,在main.c中被定義。
*****************************************************/
extern CGlobals AllGlobals;
/******************************************************
**用于控制編譯器各階是否輸出信息的標(biāo)志,在main.c中被定義
*******************************************************/
extern CFlags AllFlags;
/*************************CCommandClass 類*********************************/
CCommandClass::CCommandClass(char pa_chParameter,
void (*pa_fnpParameter)(CCompileOption& pa_ComOption),
CCommandClass *pa_pNextClass){
m_chParameter=pa_chParameter;
m_fnpParameter=pa_fnpParameter;
m_pNextClass=pa_pNextClass;
}
/*********************CCommandOpt 類****************************************/
/********************************
**靜態(tài)數(shù)據(jù)成員的初始化
********************************/
int CCommandOpt::m_argc=0;
char **CCommandOpt::m_argv=NULL;
CCommandOpt::CCommandOpt(int argc,char *argv[],CCompileOption &pa_ComOption){
m_argc=argc; m_argv=argv; //這兩個(gè)是靜態(tài)數(shù)據(jù)成員,這兒只是重新賦值。
OnParameter();
try{
if(argc==1)
throw CbadCommand("Invalid Command.");
else{
m_strComline=argv[1];
if(m_strComline[0]=='/') Lookup_Func(pa_ComOption,m_strComline[1]);
else OnlyCode(pa_ComOption);}
}
catch(CbadCommand& pa_badCommand){
pa_badCommand.m_fnImformation();}
}
/**************************************
**在類的析構(gòu)函數(shù)中銷毀鏈表
**************************************/
CCommandOpt::~CCommandOpt(){
CCommandClass *pTempClass;
while(m_pFirstClass!=NULL){
pTempClass=m_pFirstClass->m_pNextClass;
delete m_pFirstClass;
m_pFirstClass=pTempClass;
}
}
/**************************************
**建立參數(shù)與相應(yīng)處理函數(shù)的鏈表
**************************************/
void CCommandOpt::OnParameter() throw(bad_alloc){
try{
m_pFirstClass=NULL;
ADD_PARAMETER('v', OnVersion);
ADD_PARAMETER('?', OnHelp);
ADD_PARAMETER('s', OnlyScan);
ADD_PARAMETER('p', OnlyParse);
ADD_PARAMETER('a', OnlyAnalyze);
ADD_PARAMETER('c', OnlyCode);
}
catch (bad_alloc){ //處理堆分配異常。
cout<<"Can't be allocated in heap, the programme must be terminated."<<endl;
exit(1);
}
}
/*******************************************
**根據(jù)傳入的參數(shù)找到相應(yīng)的處理函數(shù)
*******************************************/
void CCommandOpt::Lookup_Func(CCompileOption& pa_ComOption,char pa_chParameter){
CCommandClass *pTempClass=m_pFirstClass; //找到鏈表頭,并順著鏈表查找函數(shù)。
if(pa_chParameter<97 && pa_chParameter!=63)
pa_chParameter+=32; //參數(shù)全部轉(zhuǎn)化為小寫處理。問號(hào)無須轉(zhuǎn)化。
while(pTempClass && pTempClass->m_chParameter!=pa_chParameter)
pTempClass=pTempClass->m_pNextClass;
if(pTempClass)
pTempClass->m_fnpParameter(pa_ComOption);//調(diào)用函數(shù)前,應(yīng)先確保指針有效。
else
throw CbadCommand("Invalid Command.");
return;
}
/*******************************************
**顯示版本信息的命令行處理函數(shù)
*******************************************/
void CCommandOpt::OnVersion(CCompileOption& pa_ComOption){
cout<<"C- compiler V1.0"<<endl;
cout<<"copyright @2002"<<endl;
cout<<"Author: Helinqiang Nancaihong"<<endl;
}
/******************************************
**顯示使用幫助信息
******************************************/
void CCommandOpt::OnHelp(CCompileOption& pa_ComOption){
cout<<endl;
cout<<"usage: "<<"hc [/v] [/?] [/s filename.c] [/p filename.c] [/a filename.c]"<<endl;
cout<<'\t'<<" [/c filname.c [filename.asm]]"<<endl<<endl;
cout<<"options:"<<endl;
cout<<'\t'<<"/v"<<"\t\t"<<"Show the version of the compiler."<<endl;
cout<<'\t'<<"/?"<<"\t\t"<<"Help information about the compiler."<<endl;
cout<<'\t'<<"/s filename.c"<<'\t'<<"Only scan the C source file."<<endl;
cout<<'\t'<<"/p filename.c"<<'\t'<<"Only prase the C source file."<<endl;
cout<<'\t'<<"/a filename.c"<<'\t'<<"Only analyze the C source file."<<endl;
cout<<'\t'<<"/c filename.c [filename.asm]]"<<endl;
cout<<"\t\t\t"<<"Generate the real asm file"<<endl;
return;
}
/******************************************
**以下四個(gè)函數(shù)處理相應(yīng)的編譯開關(guān)參數(shù)。
******************************************/
void CCommandOpt::OnlyScan(CCompileOption& pa_ComOption){
if(m_argc!=3)
throw CbadCommand("usage: hc/s filename.c\ntype hc/? for more information.");
char *pchargv=m_argv[2];
ABOUTFILENAME(".c", 2) //宏,用于辯識(shí)源文件的擴(kuò)展名,不為.c則錯(cuò)誤,沒有擴(kuò)展名,則自動(dòng)加上。
OpenSourceFile(m_argv[2]);
AllFlags.m_iTraceScan=1;
AllFlags.m_iTraceParse=0;
AllFlags.m_iTraceAnalyze=0;
AllFlags.m_TraceCode=0;
pa_ComOption.m_fNoparse=TRUE;
pa_ComOption.m_fNoanalyze=TRUE;
pa_ComOption.m_fNocode=TRUE;
}
void CCommandOpt::OnlyParse(CCompileOption& pa_ComOption){
if(m_argc!=3)
throw CbadCommand("usage: hc/p filename.c\ntype hc/? for more information.");
char *pchargv=m_argv[2];
ABOUTFILENAME(".c", 2)
OpenSourceFile(m_argv[2]);
AllFlags.m_iTraceScan=0;
AllFlags.m_iTraceParse=1;
AllFlags.m_iTraceAnalyze=0;
AllFlags.m_TraceCode=0;
pa_ComOption.m_fNoparse=FALSE;
pa_ComOption.m_fNoanalyze=TRUE;
pa_ComOption.m_fNocode=TRUE;
}
void CCommandOpt::OnlyAnalyze(CCompileOption& pa_ComOption){
if(m_argc!=3)
throw CbadCommand("usage: hc/a filename.c\ntype hc/? for more information.");
char *pchargv=m_argv[2];
ABOUTFILENAME(".c", 2)
OpenSourceFile(m_argv[2]);
AllFlags.m_iTraceScan=0;
AllFlags.m_iTraceParse=0;
AllFlags.m_iTraceAnalyze=1;
AllFlags.m_TraceCode=0;
pa_ComOption.m_fNoparse=FALSE;
pa_ComOption.m_fNoanalyze=FALSE;
pa_ComOption.m_fNocode=TRUE;
}
void CCommandOpt::OnlyCode(CCompileOption& pa_ComOption){
if(m_argc!=3 && m_argc!=4)
throw CbadCommand("usage: hc/c filename.c [filename.asm]\ntype hc/? for more information.");
char *pchargv=m_argv[2];
ABOUTFILENAME(".c", 2)
OpenSourceFile(m_argv[2]);
if(m_argc==3){ //生成代碼時(shí),沒有指定目標(biāo)代碼文件,則自動(dòng)生成與源文件同名的文件。
pchargv=m_argv[2]+strlen(m_argv[2])-2;
*pchargv='\0';
strcat(m_argv[2],".asm");
OpenCodeFile(m_argv[2]);}
else{
pchargv=m_argv[3];
ABOUTFILENAME(".asm", 3)
OpenCodeFile(m_argv[3]);}
AllFlags.m_iTraceScan=0;
AllFlags.m_iTraceParse=0;
AllFlags.m_iTraceAnalyze=0;
AllFlags.m_TraceCode=1;
pa_ComOption.m_fNoparse=FALSE;
pa_ComOption.m_fNoanalyze=FALSE;
pa_ComOption.m_fNocode=FALSE;
}
/*****************************************
** 找開源程序文件
*****************************************/
void CCommandOpt::OpenSourceFile(string filename){
AllGlobals.source.open(filename.c_str(),ios_base::in);
if(!AllGlobals.source)
throw CbadCommand("Can't find the source file.");
return;
}
/***************************************
** 打開目標(biāo)代碼文件
***************************************/
void CCommandOpt::OpenCodeFile(string filename){
AllGlobals.code.open(filename.c_str(),ios_base::out);
if(!AllGlobals.code)
throw CbadCommand("Can't find the code file.");
return;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -