天天看點

簡單的詞法分析器

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]  ==   " " )

                            {

                                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