📄 wordanalyse.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 + -