由于脚本方面不是我写的,所以只能贴出代码,这个程序实现的功能就是如果文本文件里有一条PRINT "Hello"语句,就在控制台下面打印Hello
// Mylexer.h: interface for the Mylexer class.
//
//
#include <vector>
#include "iostream.h"
#include "ctype.h"
#if !defined(AFX_MYLEXER_H__E712D09C_29BF_4A7B_ADFE_A0EA4ED8D986__INCLUDED_)
#define AFX_MYLEXER_H__E712D09C_29BF_4A7B_ADFE_A0EA4ED8D986__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
using namespace std;
struct Lexvalue
{
string value;
unsigned char type;
};
class Mylexer
{
public:
enum DATETYPES{
QUOTATION,
DIGITS,
COMMAND,
OPERATER0R,
MINUS
};
vector<Lexvalue> vDATA;
Mylexer(const char* fileline);
inline const char* gettoken();
virtual ~Mylexer();
private:
int index;
const char* skipspace(const char *str);
char checktype(char c);
};
const char* Mylexer::gettoken()
{
return vDATA[index++].value.c_str();
}
#endif // !defined(AFX_MYLEXER_H__E712D09C_29BF_4A7B_ADFE_A0EA4ED8D986__INCLUDED_)
// Mylexer.cpp: implementation of the Mylexer class.
//
//
#include "Mylexer.h"
//
// Construction/Destruction
//
Mylexer::Mylexer(const char* content)
{
index = 0;
for(int ntoken = 0;; ntoken++)
{
Lexvalue data;
const char *temp;
int qcount = 0;
content = skipspace(content);
if(!*content)
break;
data.type = checktype(*content);
if(data.type == QUOTATION)
{
while(*content != '/0')
{
data.value +=*content++;
}
}
else if(data.type == COMMAND || data.type == DIGITS)
{
//*data.value = (isspace(*content))?*content++:'/0';
while(*content != '/0' && !(isspace(*content)))
{
data.value +=*content++;
}
}
vDATA.push_back(data);
}
}
Mylexer::~Mylexer()
{
}
char Mylexer::checktype(char c)
{
if(isdigit(c))
return DIGITS;
else if(c == '"')
return QUOTATION;
else if(c >= 35 && c <=45)
return OPERATER0R;
else
return COMMAND;
}
const char *Mylexer::skipspace(const char *str)
{
//char *p = str;
while (*str && isspace(*str))
{
str++;
}
return str;
}
// Syntaxparse.h: interface for the Syntaxparse class.
//
//
//#include <string>
#include "Mylexer.h"
#if !defined(AFX_SYNTAXPARSE_H__DF32125E_FDC4_4798_92ED_4CAE0EAA8105__INCLUDED_)
#define AFX_SYNTAXPARSE_H__DF32125E_FDC4_4798_92ED_4CAE0EAA8105__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
class Syntaxparse
{
protected:
typedef void (Syntaxparse::*COMMANDFUNC)(Mylexer &lexer);
typedef struct
{
char* cmdType;
COMMANDFUNC func;
}cmdstruct;
public:
Syntaxparse();
virtual ~Syntaxparse();
//void AnalyseLine(string line);
void AnalyseLine(const char* line);
void ExecutePRINT(Mylexer &lexer);
COMMANDFUNC AnalyseCommand(Mylexer &lexer);
//void ExcutePrint(){}
};
#endif // !defined(AFX_SYNTAXPARSE_H__DF32125E_FDC4_4798_92ED_4CAE0EAA8105__INCLUDED_)
// Syntaxparse.cpp: implementation of the Syntaxparse class.
//
//
#include "Syntaxparse.h"
//
// Construction/Destruction
//
Syntaxparse::Syntaxparse()
{
//static cmdstruct cmdtab = {{"PRINT",&Syntaxparse::ExcutePrint}};
}
Syntaxparse::~Syntaxparse()
{
}
//void Syntaxparse::AnalyseLine(string line)
void Syntaxparse::AnalyseLine(const char* line)
{
Mylexer lexer(line);
Syntaxparse::COMMANDFUNC command = Syntaxparse::AnalyseCommand(lexer);
(this->*command)(lexer);
}
Syntaxparse::COMMANDFUNC Syntaxparse::AnalyseCommand(Mylexer &lexer)
{
static cmdstruct cmdtab[] = {{"PRINT",&Syntaxparse::ExecutePRINT},{NULL}};
for(cmdstruct *temp = cmdtab; temp->cmdType!=NULL;temp++)
if(!strcmp(temp->cmdType,lexer.gettoken()))
return temp->func;
}
void Syntaxparse::ExecutePRINT(Mylexer &lexer)
{
const char *str = lexer.gettoken();
//printf("this a Print function/n");
printf(str);
}
//testbegin.cpp
#include <string>
#include <fstream>
#include "Syntaxparse.h"
using namespace std;
void main()
{
char str[100];
Syntaxparse trial;
ifstream file("c://11.txt");
if(!file)
{
cerr << "c:/11.txt cannot be open"<<endl;
}
while(file)
{
file.getline(str,100);
if(*str)
trial.AnalyseLine(str);
cout<<endl;
}
}