这是CMake的源代码.主要负责词汇的提取
你可以调用它的CMake::get_token(),返回个CToken的类.
/
// Make.h
///
enum token_types{DELIMITER,VARIABLE,NUMBER,COMMAND,
STRING,QUOTE,FINISHED,NONE,ENTER}; // 标记类型集合
#define TOKEN_MAX 80
#define STRDELIMITER "+-*^/=;(),><" // 符号集合
#define DIM 11 // Dim
#define AS 12 // As
#define INTEGER 13 // Integer
#define PRINT 14 // Print
class CToken
{
public:
char token[TOKEN_MAX];
int token_type;
int tok;
};
class CMake
{
public:
CMake(char *Prog,int Proglength);
virtual ~CMake();
public:
char *prog;
int proglength;
int isdelim(char c); // 如果是运算符号返回1,不是则返回0
int iswhite(char c); // 是空格返回1,不是则返回0
int look_up(char *c); // 返回COMMAND类型,c是COMMAND字符串的指针
CToken get_token(void); // 得到标记
int findchar(char *str,char ch); // 从str里找到ch,返回其在str里的引索;如果str里没有ch,则返回-1
};
/
// Make.cpp: implementation of the CMake class.
//
//
#include "stdafx.h"
#include "Make.h"
//
// Construction/Destruction
//
CMake::CMake(char *Prog,int Proglength)
{
proglength=Proglength;
prog=new char[Proglength+1];
strcpy(prog,Prog);
}
CMake::~CMake()
{
}
CToken CMake::get_token(void)
{
register char *temp;
CToken m_token;
m_token.token_type=0;
m_token.tok=0;
temp=m_token.token;
if(*prog=='/0')
{
*m_token.token='/0';
m_token.tok=0;
m_token.token_type=FINISHED;
return m_token;
}
while(iswhite(*prog)) ++prog;
if(*prog=='/r') // 如果是换行符
{
m_token.token[0]=*prog;
m_token.token[1]='/0';
m_token.token_type=ENTER;
prog++;
return m_token;
}
if( isdelim(*prog)) // 如果找得到运算符号标记
{
*m_token.token=*prog;
*(m_token.token+1)='/0';
m_token.tok=0;
m_token.token_type=DELIMITER;
prog++;
return m_token; // 譬如 token[0]='+' token[1]='/0';
}
if(*prog=='"') // 如果是字符串
{
prog++;
int i=0;
while(*prog!='"' && *prog!='/r')
{
m_token.token[i]=*prog;
i++;
prog++;
}
prog++;
m_token.token[i]='/0';
m_token.token_type=QUOTE;
return m_token;
}
if( isdigit(*prog)) // 如果找到数字标记
{
int i=0;
while(isdigit(*prog) && i<TOKEN_MAX) // 小于token最长为80个字符
{
m_token.token[i]=*prog;
i++;
prog++;
}
m_token.token[i]='/0';
m_token.token_type=NUMBER;
return m_token;
}
if( isalpha(*prog)) // 如果是命令COMMAND或是一般标记STRING
{