关于Basic程序解释器及编译原理的简单化(2)---C++封装好的Basic解释器

这是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
 {

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值