一个可以识别C语言中标识符,关健字,运算符和各种数字的词法分析器.用VC6.0编写的. 下面是主要代码..
CString CDlg::next(int &sy,int &t) { CString r=""; int s = 1,o,st=1,bit=0; TCHAR c; t=0; o=sy; tvi=0; tvf=0; while(s&&(sy<in.GetLength())){ switch(s){ case 1: c=in[sy]; if(isspace(c)) sy++; else if(isalpha(c)||c=='_'){ s=2; r=c; sy++; } else if(isdigit(c)){ s=4; r+=c; sy++; tvi*=10; tvi+=(c-'0'); tvf*=10; tvf+=(c-'0'); } else{ switch(c){ case '+': s=14; break; case '-': s=18; break; case '*': s=23; break; case '/': s=26; break; case '%': s=29; break; case '&': s=32; break; case '|': s=36; break; case '!': s=40; break; case '~': s=43; break; case '^': s=46; break; case '=': s=49; break; case '>': s=55; break; case '<': s=61; break; case ',': case '.': case '?': case ';': case ':': case '\"': case '\'': case '{': case '}': case '[': case ']': case '(': case ')': t=4; s=0; break; default: s=13; } sy++; r+=c; } break; case 2: c=in[sy]; if(isalnum(c)||c=='_'){ s=2; r+=c; sy++; } else s=3; break; case 3: t=3; s=0; break; case 4: c=in[sy]; if(c=='.'){ s=6; r+=c; sy++; } else if((c=='E')||(c=='e')){ s=9; r+=c; sy++; tvi=0; } else if(isdigit(c)){ s=4; r+=c; sy++; tvi*=10; tvi+=(c-'0'); tvf*=10; tvf+=(c-'0'); } else s=5; break; case 5: t=1; s=0; break; case 6: c=in[sy]; if(isdigit(c)){ s=7; r+=c; sy++; bit--; tvf+=(pow(10,bit)*(c-'0')); } else s=13; break; case 7: c=in[sy]; if(isdigit(c)){ s=7; r+=c; sy++; bit--; tvf+=(pow(10,bit)*(c-'0')); } else if((c=='E')||(c=='e')){ s=9; r+=c; sy++; tvi=0; } else s=8; break; case 8: t=2; s=0; break; case 9: c=in[sy]; if(isdigit(c)){ s=11; r+=c; sy++; tvi*=10; tvi+=(c-'0'); } else if((c=='+')||(c=='-')){ s=10; r+=c; sy++; if(c=='-') st=-1; } else s=13; break; case 10: c=in[sy]; if(isdigit(c)){ s=11; r+=c; sy++; tvi*=10; tvi+=(c-'0'); } else s=13; break; case 11: c=in[sy]; if(isdigit(c)){ s=11; r+=c; sy++; tvi*=10; tvi+=(c-'0'); } else s=12; break; case 12: t=2; tvi*=st; tvf*=pow(10,tvi); s=0; break; case 13: t=0; s=0; sy=o; r+=c; m_err+=("\n不能识别字符串"+r); break; case 14: c=in[sy]; if(c=='='||c=='+'){ s=15; r+=c; sy++; } else{ s=15; } break; case 18: c=in[sy]; if(c=='='||c=='>'||c=='-'){ s=15; r+=c; sy++; } else{ s=15; } break; case 32: c=in[sy]; if(c=='='||c=='&'){ s=15; r+=c; sy++; } else{ s=15; } break; case 36: c=in[sy]; if(c=='='||c=='|'){ s=15; r+=c; sy++; } else{ s=15; } break; case 23: case 26: case 29: case 40: case 43: case 46: case 49: case 52: c=in[sy]; if(c=='='){ s=15; r+=c; sy++; } else{ s=15; } break; case 55: c=in[sy]; if(c=='='){ s=15; r+=c; sy++; } else if(c=='>'){ s=58; r+=c; sy++; } else{ s=15; } break; case 58: c=in[sy]; if(c=='='){ s=59; r+=c; sy++; } else{ s=57; r+=c; sy++; } break; case 61: c=in[sy]; if(c=='='){ s=15; r+=c; sy++; } else if(c=='<'){ s=64; r+=c; sy++; } else{ s=15; } break; case 64: c=in[sy]; if(c=='='){ s=15; r+=c; sy++; } else{ s=15; } break; case 15: t=4; s=0; break; default: s=0; break; }
} return r; }
void CDlg::OnB() { int sy =0,t=1; CString r,ts; GetDlgItemText(IDC_E,in); in+=' '; m_err=""; if(m_u.GetCheck()==1) in.MakeLower(); m_d.ResetContent(); m_id.ResetContent(); m_kw.ResetContent(); while((sy<in.GetLength())&&t){ ts=next(sy,t); switch(t){ case 1: if(ts!=""){ m_d.AddString(ts); r.Format("%s%d%s","整数[",tvi,"] "); } break; case 2: if(ts!=""){ m_d.AddString(ts); r.Format("%s%f%s","浮点数[",tvf,"] "); } break; case 3: if(ts!="") if(a.lookup(ts)){ m_kw.AddString(ts); r+=("保留字["+ts+"] "); } else{ m_id.AddString(ts); r+=("标识符["+ts+"] "); } break; case 4: if(ts!=""){ m_sy.AddString(ts); r+=("运算符["+ts+"] "); } else m_err+=(ts+"不是有效符号!"); break; default: break; } SetDlgItemText(IDC_ERR,m_err); SetDlgItemText(IDC_R,r); }
} 
|