游戏编程四:脚本的处理
2006-08-15 23:33
232 查看
由于脚本方面不是我写的,所以只能贴出代码,这个程序实现的功能就是如果文本文件里有一条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;
}
}
// 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;
}
}
相关文章推荐
- 在Unity中使用Lua脚本:语言层和游戏逻辑粘合层处理
- Unity3d动画脚本 Animation Scripting(深入了解游戏引擎中的动画处理原理)
- 在Unity中使用Lua脚本:语言层和游戏逻辑粘合层处理
- Unity3d动画脚本 Animation Scripting(深入了解游戏引擎中的动画处理原理--旧的动画系统)
- Unity3d动画脚本 Animation Scripting(深入了解游戏引擎中的动画处理原理)
- Python:pygame游戏编程之旅六(游戏中的声音处理)
- Unity3d动画脚本 Animation Scripting(深入了解游戏引擎中的动画处理原理)
- Shell脚本编程——字符串变量处理
- 25个不错PHP游戏编程脚本代码分享(1)
- 使用 Python 进行游戏脚本编程 [翻译]
- 通过一个游戏编程熟悉事件处理
- Android游戏编程之文件处理
- Windows游戏编程总结(一)图形处理中的几个函数
- 25个不错PHP的游戏编程脚本代码分享(1)
- shell脚本编程四 ——shell字符串处理
- 25个PHP游戏编程脚本代码
- 游戏编程脚本:随机名称生成器(scala)
- 25个PHP游戏编程脚本代码(转)
- PHP游戏编程25个脚本代码
- shell脚本编程-处理用户输入