|
|

楼主 |
发表于 2008-7-30 02:24:00
|
显示全部楼层
Re:求 Lex 和 Yacc 可用的下载
__forceinline Bool IsNum(WChar ch){ return ch>='0' && ch <='9'; }
__forceinline Bool IsEng(WChar ch){ return (ch>='A'&&ch <='Z') || (ch>='a'&&ch <='z') || ch=='_'; }
__forceinline Bool IsSpace(WChar ch){ return ch==10 || ch==13 || ch==' ' || ch==9; }
__forceinline Bool IsCrlf(WChar ch){ return ch==10 || ch==13; }
void CLexer::NextToken(TOKEN *pOut)
{
INST_ASSERT(m_pSrc);
INST_ASSERT(pOut);
pOut->len = 0;
static WChar ch = 0;
goto _start;
_start:
if( 0 == *m_p ) { goto _eof; } // 仅在初态中判断 eof 即可
if( IsSpace(*m_p) ) { m_p++; goto _start; }
if( '/' == *m_p ) { pOut->len++; m_p++; goto _div; } // 目前来看,需要保存这个 '/'
if( IsNum(*m_p) ) { pOut->len++; m_p++; goto _error; } // 不支持数字,出错,保存并输出该数字
if( IsEng(*m_p) ) { pOut->len++; m_p++; goto _eng; }
if( ';' == *m_p ) { pOut->len++; m_p++; goto _semi; }
if( '{' == *m_p ) { pOut->len++; m_p++; goto _left; }
if( '}' == *m_p ) { pOut->len++; m_p++; goto _right; }
else { pOut->len++; m_p++; goto _error; } // 不支持当前的字符,出错,保存并输出该字符
_div:
if( '/' == *m_p ) { pOut->len--; m_p++; goto _comment; } // 原来是注释啊,那么,清除刚刚的 '/'.( assert: pOut->len == 1 )
else { goto _error; } // 不支持除号,出错,并输出刚刚的 '/'(不是当前而是刚刚的字符非法,故指针不动)
_comment:
if( 0 == *m_p ) { goto _eof; }
if( IsCrlf(*m_p) ) { m_p++; goto _start; }
else { m_p++; goto _comment; }
_eng:
if( IsNum(*m_p) ) { pOut->len++; m_p++; goto _eng; }
if( IsEng(*m_p) ) { pOut->len++; m_p++; goto _eng; }
else { goto _eng_fnl; }
_eng_fnl:
pOut->type = TT_IDENT;
INST_ASSERT( pOut->len > 0 );
pOut->ptr = m_p - pOut->len; // 根据(该token的结尾+1)指针,和读取的长度,反过来计算出该token的开头指针.
return; // 稍候调用MapToKeyword即可...
_semi:
pOut->type = TT_SEMI;
INST_ASSERT( 1 == pOut->len );
pOut->ptr = m_p - 1; // 根据(该token的结尾+1)指针,和读取的长度,反过来计算出该token的开头指针.
return;
_left:
pOut->type = TT_BRACE_L;
INST_ASSERT( 1 == pOut->len );
pOut->ptr = m_p - 1; // 根据(该token的结尾+1)指针,和读取的长度,反过来计算出该token的开头指针.
return;
_right:
pOut->type = TT_BRACE_R;
INST_ASSERT( 1 == pOut->len );
pOut->ptr = m_p - 1; // 根据(该token的结尾+1)指针,和读取的长度,反过来计算出该token的开头指针.
return;
_eof:
pOut->type = TT_EOF;
INST_ASSERT( 0 == pOut->len );
pOut->ptr = null;
return;
_error:
pOut->type = TT_ERROR;
pOut->ptr = m_p - pOut->len; // 根据(该token的结尾+1)指针,和读取的长度,反过来计算出该token的开头指针.
return;
} |
|