源文件內容:
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 );
}
#region windows 窗體設計器生成的代碼
/// <summary>
/// 設計器支持所需的方法 - 不要使用代碼編輯器修改
/// 此方法的內容。
/// </summary>
private void initializecomponent()
{
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(8, 8);
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(240, 8);
this.button1.name = "button1";
this.button1.size = new system.drawing.size(64, 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(24, 48);
this.richtextbox1.name = "richtextbox1";
this.richtextbox1.size = new system.drawing.size(240, 352);
this.richtextbox1.tabindex = 2;
this.richtextbox1.text = "";
// this.richtextbox1.textchanged += new system.eventhandler(this.richtextbox1_textchanged);
//
// button2
//
this.button2.location = new system.drawing.point(96, 8);
this.button2.name = "button2";
this.button2.size = new system.drawing.size(64, 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(280, 48);
this.richtextbox2.name = "richtextbox2";
this.richtextbox2.size = new system.drawing.size(280, 352);
this.richtextbox2.tabindex = 4;
this.richtextbox2.text = "";
//
// button3
//
this.button3.location = new system.drawing.point(384, 8);
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);
//
// form1
//
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.maximizebox = false;
this.name = "form1";
this.text = "form1";
// this.load += new system.eventhandler(this.form1_load);
this.resumelayout(false);
}
#endregion
/// <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;
}
}
}