📄 re_syntex.inl
字号:
const re_char * szTemp = szSave;
if(m_Leaf->match(pattern,szSave,result))
{
if(szSave == szTemp)
{//有些无穷循环的在分析阶段没有检测到
pattern.eError = ree_recursion_always;
pattern._break();
return false;
}
}
else
{
break;
}
}
sz = szSave;
return true;
}
};
//+
struct rp_repeat_more_one_greed : public rp_base
{
rp_base * m_Leaf;
virtual ~rp_repeat_more_one_greed(){
delete m_Leaf;
}
virtual bool match(re_match_temp & pattern,const re_char * & sz,result_type & result){
const re_char * szSave = sz;
if(pattern._is_end(szSave) || m_Leaf->match(pattern,szSave,result) == false)
return false;
for(;!pattern._is_end(szSave);)
{
const re_char * szTemp = szSave;
if(m_Leaf->match(pattern,szSave,result))
{
if(szSave == szTemp)
{//有些无穷循环的在分析阶段没有检测到
pattern.eError = ree_recursion_always;
pattern._break();
return false;
}
}
else
{
break;
}
}
sz = szSave;
return true;
}
};
//?
struct rp_repeat_zero_one_greed : public rp_base
{
rp_base * m_Leaf;
virtual ~rp_repeat_zero_one_greed(){
delete m_Leaf;
}
virtual bool match(re_match_temp & pattern,const re_char * & sz,result_type & result){
if(!pattern._is_end(sz))
m_Leaf->match(pattern,sz,result);
return true;
}
};
//!
struct rp_not_regular : public rp_base
{
rp_base * m_Leaf;
virtual ~rp_not_regular(){
delete m_Leaf;
}
virtual bool match(re_match_temp & pattern,const re_char * & sz,result_type & result){
const re_char * szSave = sz;
result_type r;
if(!m_Leaf->match(pattern,szSave,r))
{
sz = Next(sz);
return true;
}
return false;
}
};
//|
struct rp_or_regular : public rp_base
{
rp_base * m_First;
rp_base * m_Second;
virtual ~rp_or_regular(){
delete m_First;
delete m_Second;
}
virtual bool match(re_match_temp & pattern,const re_char * & sz,result_type & result){
const re_char * szSave = sz;
if(m_First->match(pattern,sz,result))
return true;
sz = szSave;
if(m_Second->match(pattern,sz,result))
return true;
return false;
}
};
//&
struct rp_and_regular : public rp_base
{
rp_base * m_First;
rp_base * m_Second;
virtual ~rp_and_regular(){
delete m_First;
delete m_Second;
}
virtual bool match(re_match_temp & pattern,const re_char * & sz,result_type & result){
const re_char * sz1 = sz;
const re_char * sz2 = sz;
if(!m_First->match(pattern,sz1,result))
return false;
if(!m_Second->match(pattern,sz2,result))
return false;
if(sz1 == sz2)
{
sz = sz1;
return true;
}
return false;
}
};
//-----------------------------------------------------------------------------
re_error _match(re_match_temp & pattern,const re_char * sz,result_type & result) const
{
if(m_Syntex == NULL)
return ree_noparse;
while(pattern._is_break() == false && !pattern._is_end(sz))
{
const re_char * szTemp = sz;
if(m_Syntex->match(pattern,szTemp,result))
{
result.m_Match.begin = sz;
result.m_Match.end = szTemp;
return ree_ok;
}
sz = Next(sz);
}
return pattern.eError == ree_ok ? ree_nomatch : pattern.eError;
}
//-----------------------------------------------------------------------------
public:
// 分析的结果
re_error m_eError;
re_flags m_eFlags;
rp_array * m_Syntex;
// 分析时的临时变量
size_t m_nGroupId;
std::vector<rp_array *> m_Syntexes;
// parser
void _push_syntex(rp_array * pSyntex){
m_Syntexes.push_back(m_Syntex);
m_Syntex = pSyntex;
}
void _pop_syntex(){
m_Syntex = m_Syntexes.back();
m_Syntexes.pop_back();
}
void _break(){
m_bBreak = true;
}
void _optimize(){
}
size_t _get_escape_char(re_block * root,const re_char * & sz)
{
size_t c = ToSize_t(sz);
const re_char * szSave = sz;
sz = Next(sz);
switch(c)
{
case rt_return:
if(option() & rf_return)
return '\r';
return c;
case rt_enter:
return '\n';
case rt_tab:
return '\t';
case rt_hex_prefix:
case rt_hex_prefix2:
{
if(root->_is_end(sz))
return c;
re_char * szEnd;
long lHex = to_hex(sz,root->szEnd,&szEnd);
if(sz == szEnd)
return c;
sz = szEnd;
return (size_t)lHex;
}
break;
case rt_oct_prefix:
case rt_oct_prefix2:
{
if(root->_is_end(sz))
return c;
re_char * szEnd;
long lHex = to_oct(sz,root->szEnd,&szEnd);
if(sz == szEnd)
return c;
sz = szEnd;
return (size_t)lHex;
}
break;
default:
if(IsDigit(szSave))
{
re_char * szEnd;
long lDigit = to_int(szSave,root->szEnd,&szEnd);
sz = szEnd;
return (size_t)lDigit;
}
break;
}
return c;
}
re_error _parse_not_range(re_block * root,const re_char * & sz)
{
sz = Next(sz);
if(root->_is_end(sz))
return ree_syntex;
rp_range * Syntex;
if(rt_not_range == ToSize_t(sz))
{
sz = Next(sz);
if(root->_is_end(sz))
return ree_syntex;
Syntex = new rp_not_range;
}
else
{
Syntex = new rp_range;
}
m_Syntex->m_Syntex.push_back(Syntex);
return _parse_range(root,sz,*Syntex);
}
re_error _parse_range(re_block * root,const re_char * & sz,rp_range & Syntex)
{
if(root->_is_end(sz))
return ree_syntex;
size_t old = ToSize_t(sz);
do
{
sz = Next(sz);
size_t begin = old;
if(rt_range_end == begin)
break;
if(rt_escape == begin)
{
if(root->_is_end(sz))
return ree_syntex;
begin = _get_escape_char(root,sz);
}
if(root->_is_end(sz))
return ree_syntex;
old = ToSize_t(sz);
if(rt_range_sign == old)
{//范围
sz = Next(sz);
if(root->_is_end(sz))
return ree_syntex;
old = ToSize_t(sz);
if(rt_range_end == old)
return ree_syntex;
if(rt_escape == old)
{
sz = Next(sz);
if(root->_is_end(sz))
return ree_syntex;
old = _get_escape_char(root,sz);
}
else
sz = Next(sz);
range_range rr;
if(begin < old)
{
rr.begin = begin;
rr.end = old;
}
else
{
rr.begin = old;
rr.end = begin;
}
Syntex.m_Range.push_back(rr);
if(!root->_is_end(sz))
old = ToSize_t(sz);
}
else
{
Syntex.m_In.push_back(begin);
}
}
while(!root->_is_end(sz));
if(Syntex.m_In.size() == 0 && Syntex.m_Range.size() == 0)
return ree_syntex;
std::sort(Syntex.m_In.begin(),Syntex.m_In.end());
return ree_ok;
}
re_error _parse_begin_line(const re_char * & sz)
{
rp_base * Syntex;
if(option() & rf_multi_line)
Syntex = new rp_begin_line;
else
Syntex = new rp_begin_all;
m_Syntex->m_Syntex.push_back(Syntex);
sz = Next(sz);
return ree_ok;
}
re_error _parse_end_line(const re_char * & sz)
{
rp_base * Syntex;
if(option() & rf_multi_line)
Syntex = new rp_end_line;
else
Syntex = new rp_end_all;
m_Syntex->m_Syntex.push_back(Syntex);
sz = Next(sz);
return ree_ok;
}
re_error _parse_any(const re_char * & sz)
{
sz = Next(sz);
rp_base * Syntex;
if(option() & rf_multi_line)
Syntex = new rp_any_multi_line;
else
Syntex = new rp_any_single_line;
m_Syntex->m_Syntex.push_back(Syntex);
return ree_ok;
}
re_error _parse_more_zero(re_block * root,const re_char * & sz)
{
if(m_Syntex->m_Syntex.size() == 0)
return ree_syntex;
sz = Next(sz);
if(!root->_is_end(sz))
{
if(rt_zero_one == ToSize_t(sz))
{
rp_repeat_more_zero * Syntex = new rp_repeat_more_zero;
Syntex->m_Leaf = m_Syntex->m_Syntex.back();
m_Syntex->m_Syntex.back() = Syntex;
sz = Next(sz);
rp_array * pNew = new rp_array;
Syntex->m_Next = pNew;
m_Syntex->m_Syntex.push_back(pNew);
_push_syntex(pNew);
const re_char * szSave = root->szStart;
root->szStart = sz;
re_error e = _parse_array(root);
root->szStart = szSave;
_pop_syntex();
sz = root->szEnd;
return e;
}
}
rp_repeat_more_zero_greed * Syntex = new rp_repeat_more_zero_greed;
Syntex->m_Leaf = m_Syntex->m_Syntex.back();
m_Syntex->m_Syntex.back() = Syntex;
return ree_ok;
}
re_error _parse_more_one(re_block * root,const re_char * & sz)
{
if(m_Syntex->m_Syntex.size() == 0)
return ree_syntex;
sz = Next(sz);
if(!root->_is_end(sz))
{
if(rt_zero_one == ToSize_t(sz))
{
rp_repeat_more_one * Syntex = new rp_repeat_more_one;
Syntex->m_Leaf = m_Syntex->m_Syntex.back();
m_Syntex->m_Syntex.back() = Syntex;
sz = Next(sz);
rp_array * pNew = new rp_array;
Syntex->m_Next = pNew;
m_Syntex->m_Syntex.push_back(pNew);
_push_syntex(pNew);
const re_char * szSave = root->szStart;
root->szStart = sz;
re_error e = _parse_array(root);
root->szStart = szSave;
_pop_syntex();
sz = root->szEnd;
return e;
}
}
rp_repeat_more_one_greed * Syntex = new rp_repeat_more_one_greed;
Syntex->m_Leaf = m_Syntex->m_Syntex.back();
m_Syntex->m_Syntex.back() = Syntex;
return ree_ok;
}
re_error _parse_not(re_block * root,const re_char * & sz)
{
if(m_Syntex->m_Syntex.size() == 0)
return ree_syntex;
sz = Next(sz);
rp_not_regular * Syntex = new rp_not_regular;
Syntex->m_Leaf = m_Syntex->m_Syntex.back();
m_Syntex->m_Syntex.back() = Syntex;
return ree_ok;
}
re_error _parse_zero_one(re_block * root,const re_char * & sz)
{
if(m_Syntex->m_Syntex.size() == 0)
return ree_syntex;
sz = Next(sz);
if(!root->_is_end(sz))
{
if(rt_zero_one == ToSize_t(sz))
{
rp_repeat_zero_one * Syntex = new rp_repeat_zero_one;
Syntex->m_Leaf = m_Syntex->m_Syntex.back();
m_Syntex->m_Syntex.back() = Syntex;
sz = Next(sz);
rp_array * pNew = new rp_array;
Syntex->m_Next = pNew;
m_Syntex->m_Syntex.push_back(pNew);
_push_syntex(pNew);
const re_char * szSave = root->szStart;
root->szStart = sz;
re_error e = _parse_array(root);
root->szStart = szSave;
_pop_syntex();
sz = root->szEnd;
return e;
}
}
rp_repeat_zero_one_greed * Syntex = new rp_repeat_zero_one_greed;
Syntex->m_Leaf = m_Syntex->m_Syntex.back();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -