您的位置:首页 > 编程语言

游戏编程四:脚本的处理

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;
 }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息