⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wordanalyse.cpp

📁 C++编写的词法分析器
💻 CPP
字号:
#include "wordAnalyse.h"
#include <iostream>
#include <algorithm>
using namespace std;

namespace cmm
{
	const int NUM=9, MARK=10, KEYWORD=1, SYMBOL=10;
		
	string kw[]={"if","else","while","read","write","int","real"};
  vector<string> key_words(kw,kw+7);
  string sb[]={"+","-","==","<>","*","/","=","<","==","(",")",";","{","}","/*","*/","[","]"};
  vector<string> symbols(sb,sb+17);
  
  int is_keyWord(string s) // 是否保留字
  {
  	vector<string>::iterator i=find(key_words.begin(), key_words.end(), s);
  		if (i==key_words.end()) return -1;
      else return (i-key_words.begin()); // 保留字的序号
  }

  int is_symbol(string s) // 是否特殊符号
  {
  	vector<string>::iterator i=find(symbols.begin(), symbols.end(), s);
  		if (i==symbols.end()) return -1;
      else return (i-symbols.begin()); // 保留字的序号
  }

  int is_number(string s) // 是否数字
  {
  	bool has_a_point=false;
    for(string::iterator i=s.begin(); i!=s.end(); ++i)
    {
      if (*i<'0' || *i>'9') return -1;  // 非数字
      if (*i=='.')
      { 
      	if (has_a_point) return -1; //已有小数点
      	else has_a_point=true;
      }
    }
    return 0; // 是数字
  }

  int is_mark(string s) // 是否标识符	
  {
  	for(string::iterator i=s.begin(); i!=s.end(); ++i)
      if ( (*i<'a' || *i>'z')	&& (*i<'A' || *i>'Z') && (*i!='_') ) return false;//非字母数字下划线字符
    if ( !(*s.begin()<'0' || *s.begin()>'9') ) return -1; // 数字开头
    if (*s.end()=='_') return -1; // 下划线结尾
    return 0; // 是标识符
  }
  
  string::iterator find_symbol(string::iterator first, string::iterator last, int& sym_length) // 标识符匹配
  {
    string::iterator si; 
    for (vector<string>::iterator vsi=symbols.begin(); vsi!=symbols.end(); ++vsi)
    {
      si=search(first, last, vsi->begin(), vsi->end());
      if (si!=last) { sym_length=vsi->size() ; return si; } //vsi-symbols.begin():标识符的序号
    }
    return si;
  }
  
  vector<string> breaks(string s) // 按特殊符号分割
  {
  	//bool is_symbol_bool(string s) { return (is_symbol(s)!=-1) ; }
    vector<string> tmp(0);
    string::iterator i=s.begin(),last=s.begin(); // last : 上一次分割后的位置
    int sym_length; // 特殊符号的序号
    while (i!=s.end())
    {
      i=find_symbol(last, s.end(), sym_length);
      if (i!=s.end())  // 找到一个符号
      {
        if (i!=last) tmp.push_back(string(last, i));	
        tmp.push_back(string(i, i+sym_length) );
        last=i+sym_length;
      }
      else
      {
        tmp.push_back(string(last, s.end()) ); 
      }
    }
    return tmp;
  }
  
  int transform(string s) // 转换为编码
  {
  	string output("");
  	int tmp;
  	
  	tmp=is_keyWord(s);
    if (tmp!=-1) return tmp+KEYWORD;
    tmp=is_symbol(s); 
    if (tmp!=-1) return tmp+SYMBOL;
    tmp=is_number(s);
    if (tmp!=-1) return tmp+NUM;
    tmp=is_mark(s);
    if (tmp!=-1) return tmp+MARK;
    return -1;
  }
  
}//~namespace cmm

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -