简单的词法分析器

using  System.Data;
using  System.Drawing;
using  System.Text;
using  System.Windows.Forms;

namespace  cifa
{    
        
public   partial   class  词法分析 : System.Windows.Forms.Form
        {
            
private  System.Windows.Forms.Label label1;
            
            
private  System.Windows.Forms.Button button1;
            
private  System.Windows.Forms.Button button2;
            
private  System.Windows.Forms.Button button3;

            
private  System.Windows.Forms.RichTextBox richTextBox1;
            
private  System.Windows.Forms.RichTextBox richTextBox2;

            
private  System.Windows.Forms.OpenFileDialog openFileDialog1;
            
private  System.Windows.Forms.SaveFileDialog saveFileDialog1;

            
///   <summary>
            
///  必需的设计器变量。
            
///   </summary>
             private  System.ComponentModel.Container components  =   null ;

            
public  词法分析()
            {
                
//
                
//  Windows 窗体设计器支持所必需的
                
//
                InitializeComponent();

                
//
                
//  TODO: 在 InitializeComponent 调用后添加任何构造函数代码
                
//
            }

            
///   <summary>
            
///  清理所有正在使用的资源。
            
///   </summary>
             protected   override   void  Dispose( bool  disposing)
            {
                
if  (disposing)
                {
                    
if  (components  !=   null )
                    {
                        components.Dispose();
                    }
                }
                
base .Dispose(disposing);
            }

            
#region  Windows 窗体设计器生成的代码
            
///   <summary>
            
///  设计器支持所需的方法 - 不要使用代码编辑器修改
            
///  此方法的内容。
            
///   </summary>
             private   void  InitializeComponent()
            {
                System.ComponentModel.ComponentResourceManager resources 
=   new  System.ComponentModel.ComponentResourceManager( typeof (词法分析));
                
this .label1  =   new  System.Windows.Forms.Label();
                
this .button1  =   new  System.Windows.Forms.Button();
                
this .richTextBox1  =   new  System.Windows.Forms.RichTextBox();
                
this .button2  =   new  System.Windows.Forms.Button();
                
this .richTextBox2  =   new  System.Windows.Forms.RichTextBox();
                
this .openFileDialog1  =   new  System.Windows.Forms.OpenFileDialog();
                
this .saveFileDialog1  =   new  System.Windows.Forms.SaveFileDialog();
                
this .button3  =   new  System.Windows.Forms.Button();
                
this .SuspendLayout();
                
//  
                
//  label1
                
//  
                 this .label1.Location  =   new  System.Drawing.Point( 265 110 );
                
this .label1.Name  =   " label1 " ;
                
this .label1.Size  =   new  System.Drawing.Size( 72 24 );
                
this .label1.TabIndex  =   0 ;
                
this .label1.Text  =   " 词法分析 " ;
                
//  
                
//  button1
                
//  
                 this .button1.Location  =   new  System.Drawing.Point( 267 199 );
                
this .button1.Name  =   " button1 " ;
                
this .button1.Size  =   new  System.Drawing.Size( 56 23 );
                
this .button1.TabIndex  =   1 ;
                
this .button1.Text  =   " 分析 " ;
                
this .button1.Click  +=   new  System.EventHandler( this .button1_Click);
                
//  
                
//  richTextBox1
                
//  
                 this .richTextBox1.Location  =   new  System.Drawing.Point( 11 48 );
                
this .richTextBox1.Name  =   " richTextBox1 " ;
                
this .richTextBox1.Size  =   new  System.Drawing.Size( 240 352 );
                
this .richTextBox1.TabIndex  =   2 ;
                
this .richTextBox1.Text  =   "" ;
                
//  
                
//  button2
                
//  
                 this .button2.Location  =   new  System.Drawing.Point( 267 170 );
                
this .button2.Name  =   " button2 " ;
                
this .button2.Size  =   new  System.Drawing.Size( 56 23 );
                
this .button2.TabIndex  =   3 ;
                
this .button2.Text  =   " 读入 " ;
                
this .button2.Click  +=   new  System.EventHandler( this .button2_Click);
                
//  
                
//  richTextBox2
                
//  
                 this .richTextBox2.Location  =   new  System.Drawing.Point( 329 48 );
                
this .richTextBox2.Name  =   " richTextBox2 " ;
                
this .richTextBox2.Size  =   new  System.Drawing.Size( 240 352 );
                
this .richTextBox2.TabIndex  =   4 ;
                
this .richTextBox2.Text  =   "" ;
                
//  
                
//  button3
                
//  
                 this .button3.Location  =   new  System.Drawing.Point( 267 228 );
                
this .button3.Name  =   " button3 " ;
                
this .button3.Size  =   new  System.Drawing.Size( 56 23 );
                
this .button3.TabIndex  =   5 ;
                
this .button3.Text  =   " 保存 " ;
                
this .button3.Click  +=   new  System.EventHandler( this .button3_Click);
                
//  
                
//  词法分析
                
//  
                 this .AutoScaleBaseSize  =   new  System.Drawing.Size( 6 14 );
                
this .ClientSize  =   new  System.Drawing.Size( 584 430 );
                
this .Controls.Add( this .button3);
                
this .Controls.Add( this .richTextBox2);
                
this .Controls.Add( this .button2);
                
this .Controls.Add( this .richTextBox1);
                
this .Controls.Add( this .button1);
                
this .Controls.Add( this .label1);
                
this .Icon  =  ((System.Drawing.Icon)(resources.GetObject( " $this.Icon " )));
                
this .MaximizeBox  =   false ;
                
this .Name  =   " 词法分析 " ;
                
this .Text  =   " 词法分析 " ;
                
this .ResumeLayout( false );

            }
            
#endregion

            
///   <summary>
            
///  应用程序的主入口点。
            
///   </summary>
            [STAThread]
            
static   void  Main()
            {
                Application.Run(
new  词法分析());
            }
            
///   <summary>
            
///  词法分析函数
            
///   </summary>
            
///   <param name="sender"></param>
            
///   <param name="e"></param>
             private   void  button1_Click( object  sender, System.EventArgs e)
            {
                
// 得到想要的字符数组。
                 char [] getch  =  textToCharArray();

                
// 将字符数组,转换为词法分析后的 单词数组。
                 string [] stringArray  =  charArrayToStringArray(getch);

                
// 将单词数组分类,用数字标出各个单词所在的类别。
                 string [,] twoStringArray  =  stringArrayToTwoStringArray(stringArray);

                
// 用于输出二维数组。
                printString(twoStringArray);

            }
            
///   <summary>
            
///  输出结果 即用于输出二维数组。
            
///   </summary>
            
///   <param name="twoStringArray"></param>
             private   void  printString( string [,] twoStringArray)
            {
                
// 提示说明
                 this .richTextBox2.Text  =   " 前方标志: " + " " + " 1 -> 保留字 "   +   " "   +
                      
" 2 -> 运算符 "   +   " "   +
                      
" 3 -> 分隔符 "   +   " "   +
                      
" 4 -> 数字  "   +   " "   +
                      
" 5 -> 其它 "   +   " " ;
                
// 输出二维数组中的数据
                 for  ( int  x  =   0 ; x  <  twoStringArray.Length  /   2 ; x ++ )
                {
                    
for  ( int  y  =   0 ; y  <   2 ; y ++ )
                    {
                        
this .richTextBox2.Text  =   this .richTextBox2.Text  +  twoStringArray[y, x]  +   "   " ;
                        
if  (y  ==   1 )
                        {
                            
this .richTextBox2.Text  =   this .richTextBox2.Text  +   " " ;
                        }
                    }
                }
            }

            
///   <summary>
            
///  打开方件
            
///   </summary>
            
///   <param name="sender"></param>
            
///   <param name="e"></param>
             private   void  button2_Click( object  sender, System.EventArgs e) //  文件打开的方法。
            {
                openFileDialog1.Filter 
=   " 文本文件(*.txt)|*.txt " ;
                openFileDialog1.Title 
=   " 打开要分析的源文件。 " ;

                
if  (openFileDialog1.ShowDialog()  ==  DialogResult.OK)
                {
                    System.IO.StreamReader sr 
=   new  System.IO.StreamReader(openFileDialog1.FileName);
                    
this .richTextBox1.Text  =  sr.ReadToEnd();
                    sr.Close();
                }
            }
            
///   <summary>
            
///  保存文件 
            
///   </summary>
            
///   <param name="sender"></param>
            
///   <param name="e"></param>
             private   void  button3_Click( object  sender, System.EventArgs e)
            {
                saveFileDialog1.Filter 
=   " 文本文件(*.txt)|*.txt " ;
                saveFileDialog1.Title 
=   " 保存分析结果. " ;
                
if  (saveFileDialog1.ShowDialog()  ==  DialogResult.OK)
                {
                    System.IO.StreamWriter wr 
=   new
                     System.IO.StreamWriter(saveFileDialog1.FileName);
                    wr.Write(
this .richTextBox2.Text);
                    wr.Close();
                }
            }

            
///   <summary>
            
///  引用二维数组和单词的标志j
            
///   </summary>
            
///   <param name="twoArray"></param>
            
///   <param name="j"></param>
             private   void  oneArrayToTwo( ref   string [,] twoArray,  ref   int  j)
            {

                
string [,] tempArray  =  twoArray;
                twoArray 
=   new   string [ 2 , j  +   2 ];
                
for  ( int  x  =   0 ; x  <   2 ; x ++ )
                {
                    
for  ( int  y  =   0 ; y  <  j  +   1 ; y ++ )
                    {
                        twoArray[x, y] 
=  tempArray[x, y];
                    }
                }
                j 
=  j  +   1 ;
            }
            
///   <summary>
            
///  引用单词数组,和要加入单词数组的单词
            
///   </summary>
            
///   <param name="stringArrange"></param>
            
///   <param name="st"></param>
             private   void  stringToArrayString( ref   string [] stringArrange,  string  st)
            {

                
if  (stringArrange[ 0 ==   "" )
                {
                    stringArrange[
0 =  st;
                }
                
else
                {
                    
string [] oldA  =  stringArrange; // 刚得到的字符串
                     int  i  =  oldA.Length  +   1 ;
                    stringArrange 
=   new   string [i]; // 申请一个长一个的字符数组。
                    oldA.CopyTo(stringArrange,  0 ); // 将先前的字符数组考到现在这个数组中。
                    stringArrange[stringArrange.Length  -   1 =  st;
                }
            }
            
///   <summary>
            
///  将Text中的字符串,存入一个字符数组中。
            
///   </summary>
            
///   <returns></returns>
             private   char [] textToCharArray()
            {
                
string  stringTemp;
                stringTemp 
=   this .richTextBox1.Text;
                
char [] getch  =  stringTemp.ToCharArray(); // 要处理的字符都在getch这个数组中。
                 return  getch;
            }
            
///   <summary>
            
///  字符数组 到 单词数组
            
///   </summary>
            
///   <param name="getch"></param>
            
///   <returns></returns>
             private   string [] charArrayToStringArray( char [] getch) // 将字符数组转换为字符串数组。即词法分析后的单词数组。
            {
                
string [] stringArrange  = ""  }; // 用这个字符串数组存放词法分析后得到的单词。
                 char  charTemp;
                
string  stringSave  =   "" ; //   存放一个分析得到的单词

                
// 一次循环因得到一个单词。
                 for  ( int  i  =   0 ; i  <  getch.Length; i ++ )
                {
                    charTemp 
=  getch[i];

                    
// 由字母开头 数字和字母组成的单词。
                     if  (charTemp  >=   ' a '   &&
                     charTemp 
<=   ' z '
                     
||
                     charTemp 
>=   ' A '   &&
                     charTemp 
<=   ' Z ' )
                    {
                        stringSave 
=  charTemp.ToString();
                        i 
=  i  +   1 ;
                        
int  test  =   0 ; // 判断循环是否结束,1 为结束。
                         while  (test  ==   0 )
                        {
                            charTemp 
=  getch[i];
                            
if  (charTemp  >=   ' a '   &&
                             charTemp 
<=   ' z '
                             
||
                             charTemp 
>=   ' A '   &&
                             charTemp 
<=   ' Z '
                             
||
                             charTemp 
>=   ' 0 '   &&
                             charTemp 
<=   ' 9 ' )
                            {
                                stringSave 
=  stringSave  +  charTemp.ToString();
                                i 
=  i  +   1 ;
                            }
                            
else
                                test 
=   1 ;
                        }
                        stringToArrayString(
ref  stringArrange, stringSave);
                    }
                    stringSave 
=   "" ;
                    
// 由数字组成的单词。
                     if  (charTemp  >=   ' 0 '   &&
                     charTemp 
<=   ' 9 ' )
                    {
                        stringSave 
=  stringSave  +  charTemp.ToString();
                        i 
=  i  +   1 ;
                        
int  test1  =   0 ;
                        
while  (test1  ==   0 )
                        {
                            charTemp 
=  getch[i];
                            
if  (charTemp  >=   ' 0 '   &&
                             charTemp 
<=   ' 9 ' )
                            {
                                stringSave 
=  stringSave  +  charTemp.ToString();
                                i 
=  i  +   1 ;
                            }
                            
else
                                test1 
=   1 ;
                        }
                        stringToArrayString(
ref  stringArrange, stringSave);
                    }
                    stringSave 
=   "" ;
                    
// 由运算符组成的单词。
                     if  (charTemp  ==   ' + '
                     
||  charTemp  ==   ' - '
                     
||  charTemp  ==   ' * '
                     
||  charTemp  ==   ' / '
                     
||  charTemp  ==   ' = '
                     
||  charTemp  ==   ' < '
                     
||  charTemp  ==   ' > '
                     
||  charTemp  ==   ' ! ' )
                    {
                        stringSave 
=  stringSave  +  charTemp.ToString();
                        i 
=  i  +   1 ;
                        
int  test2  =   0 ;
                        
while  (test2  ==   0 )
                        {
                            charTemp 
=  getch[i];
                            
if  (charTemp  ==   ' + '
                             
||  charTemp  ==   ' - '
                             
||  charTemp  ==   ' * '
                             
||  charTemp  ==   ' / '
                             
||  charTemp  ==   ' = '
                             
||  charTemp  ==   ' < '
                             
||  charTemp  ==   ' > '
                             
||  charTemp  ==   ' ! ' )
                            {
                                stringSave 
=  stringSave  +  charTemp.ToString();
                                i 
=  i  +   1 ;
                            }
                            
else
                                test2 
=   1 ;
                        }
                        stringToArrayString(
ref  stringArrange, stringSave);
                    }
                    stringSave 
=   "" ;
                    
// 由介符组成的单词。
                     if  (charTemp  ==   ' ( '
                     
||  charTemp  ==   ' ) '
                     
||  charTemp  ==   ' { '
                     
||  charTemp  ==   ' } '
                     
||  charTemp  ==   ' [ '
                     
||  charTemp  ==   ' ] '
                     
||  charTemp  ==   ' , '
                     
||  charTemp  ==   ' : '
                     
||  charTemp  ==   ' ; '
                     
||  charTemp  ==   ' " '
                     
||  charTemp  ==   ' ' '
                     
||  charTemp  ==   ' / ' )
                    {
                        stringSave 
=  stringSave  +  charTemp.ToString();
                        stringToArrayString(
ref  stringArrange, stringSave);
                    }
                }
                
return  stringArrange;
            }
            
///   <summary>
            
///  单词数组 到 二维单词数组。
            
///   </summary>
            
///   <param name="stringArray"></param>
            
///   <returns></returns>
             private   string [,] stringArrayToTwoStringArray( string [] stringArray)
            {
                
// 存放单词标识后的结果。
                 string [,] twoArray  =   new   string [ 2 1 ];
                
// 单词的标志
                 int  j  =   0 ;


                
// 每循环一次,把一个单词归于一类,即前面加上一个数字。
                 for  ( int  i  =   0 ; i  <  stringArray.Length; i ++ )
                {
                    
// 保留字 1
                     if  (stringArray[i]  ==   " main "
                     
||  stringArray[i]  ==   " int "
                     
||  stringArray[i]  ==   " float "
                     
||  stringArray[i]  ==   " printf "
                     
||  stringArray[i]  ==   " if "
                     
||  stringArray[i]  ==   " for "
                     
||  stringArray[i]  ==   " while "
                     
||  stringArray[i]  ==   " do "
                     
||  stringArray[i]  ==   " return "
                     
||  stringArray[i]  ==   " break "
                     
||  stringArray[i]  ==   " continue "
                     
||  stringArray[i]  ==   " char "
                        
||  stringArray[i]  ==   " string "
                        
||  stringArray[i]  ==   " void " )
                    {
                        twoArray[
0 , j]  =   " 1 " ;
                        twoArray[
1 , j]  =  stringArray[i];
                        
this .oneArrayToTwo( ref  twoArray,  ref  j);
                    }
                    
// 运算符 2 
                     else
                        
if  (stringArray[i]  ==   " + "
                         
||  stringArray[i]  ==   " - "
                         
||  stringArray[i]  ==   " * "
                         
||  stringArray[i]  ==   " / "
                         
||  stringArray[i]  ==   " > "
                         
||  stringArray[i]  ==   " < "
                         
||  stringArray[i]  ==   " >= "
                         
||  stringArray[i]  ==   " <= "
                         
||  stringArray[i]  ==   " != "
                         
||  stringArray[i]  ==   " == "
                         
||  stringArray[i]  ==   " ++ "
                         
||  stringArray[i]  ==   " -- "
                         
||  stringArray[i]  ==   " = " )
                        {
                            twoArray[
0 , j]  =   " 2 " ;
                            twoArray[
1 , j]  =  stringArray[i];
                            
this .oneArrayToTwo( ref  twoArray,  ref  j);
                        }
                        
// 分隔符 3 
                         else
                            
if  (stringArray[i]  ==   " ( "
                             
||  stringArray[i]  ==   " ) "
                             
||  stringArray[i]  ==   " { "
                             
||  stringArray[i]  ==   " } "
                             
||  stringArray[i]  ==   " [ "
                             
||  stringArray[i]  ==   " ] "
                             
||  stringArray[i]  ==   " , "
                             
||  stringArray[i]  ==   " ; "
                             
||  stringArray[i]  ==   " : "
                             
||  stringArray[i]  ==   " " "
                             
||  stringArray[i]  ==   " /* "
                             
||  stringArray[i]  ==   " */ " )
                            {
                                twoArray[
0 , j]  =   " 3 " ;
                                twoArray[
1 , j]  =  stringArray[i];
                                
this .oneArrayToTwo( ref  twoArray,  ref  j);
                            }
                            
// 数字 4
                             else
                                
if  (stringArray[i].ToCharArray()[ 0 >=   ' 0 '   &&
                                 stringArray[i].ToCharArray()[
0 <=   ' 9 ' )
                                {
                                    twoArray[
0 , j]  =   " 4 " ; // 数字
                                    twoArray[ 1 , j]  =  stringArray[i];
                                    
this .oneArrayToTwo( ref  twoArray,  ref  j);
                                }
                                
// 其它 5(变量等)
                                 else
                                {
                                    twoArray[
0 , j]  =   " 5 " ;
                                    twoArray[
1 , j]  =  stringArray[i];
                                    
this .oneArrayToTwo( ref  twoArray,  ref  j);
                                }
                }
                
return  twoArray;
            }

            
private   void  button4_Click( object  sender, EventArgs e)
            {
                
// 得到想要的字符数组。
                 char [] getch  =  textToCharArray();

                
// 将字符数组,转换为词法分析后的 单词数组。
                 string [] stringArray  =  charArrayToStringArray(getch);

                
// 将单词数组分类,用数字标出各个单词所在的类别。
                 string [,] twoStringArray  =  stringArrayToTwoStringArray(stringArray);


            }
        }


    
}
代码打包下载: http://download1.csdn.net/down3/20070520/20153718894.rar
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值