using System; 
using System.Drawing; 
using System.Collections; 
using System.ComponentModel; 
using System.Windows.Forms; 
using System.Data; 

namespace wzy2 

 
/// <summary> 
 
/// Form1 的摘要说明。 
 
/// </summary> 

 public class Form1 : 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 Form1() 
  

   
// 
   
// Windows 窗体设计器支持所必需的 
   
// 
   InitializeComponent(); 

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

  
/// <summary> 
  
/// 清理所有正在使用的资源。 
  
/// </summary> 

  protected override void Dispose( bool disposing ) 
  

   
if( disposing ) 
   

    
if (components != null
    

     components.Dispose(); 
    }
 
   }
 
   
base.Dispose( disposing ); 
  }
 

  
Windows 窗体设计器生成的代码 

  
/// <summary> 
  
/// 应用程序的主入口点。 
  
/// </summary> 

  [STAThread] 
  
static void Main() 
  

   Application.Run(
new Form1()); 
  }
 
/// <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 -> 保留字"  + "\r\n" + 
         
"2 -> 运算符"  + "\r\n" + 
         
"3 -> 分隔符"  + "\r\n" + 
         
"4 -> 数字 "   + "\r\n" + 
         
"5 -> 其它"    + "\r\n"
   
//输出二维数组中的数据 
   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 + "\r\n"
     }
 
    }
 
   }
 
  }
 

/// <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"
    

     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; 
  }
 

 }
 
}

http://www.xmlasp.net/n1466c13.aspx
posted on 2007-02-01 09:56  mbskys  阅读(345)  评论(0)    收藏  举报