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