📄 form1.cs
字号:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Collections;
namespace cifafenxi
{
public partial class Form1 : Form
{
private System.Windows.Forms.OpenFileDialog openFileDialog1;
private System.Windows.Forms.SaveFileDialog saveFileDialog1;
public void cifafenxiqi()
{
//
// Windows 窗体设计器支持所必需的
//
InitializeComponent();
//
// TODO: 在 InitializeComponent 调用后添加任何构造函数代码
//
}
public Form1()
{
InitializeComponent();
}
string stringTemp;
char[] getch = new char[256];
int count = 0;
string[] stringArrange;
private void button开始分析_Click(object sender, EventArgs e)
{
//得到想要的字符数组。
getch = textToCharArray();
//将字符数组,转换为词法分析后的单词数组。
string[] stringArray = charArrayToStringArray(getch);
//将单词数组分类,用数字标出各个单词所在的类别。
string[,] twoStringArray = stringArrayToTwoStringArray(stringArray);
//用于输出二维数组。
printString(twoStringArray);
}
private char[] textToCharArray()
{
stringTemp = this.shuru.Text;
char[] getch = stringTemp.ToCharArray();//要处理的字符都在getch这个数组中。
return getch;
}
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;
}
private void stringToArrayString(string st)
{
if (count == 0)
{
stringArrange = new string[1];
stringArrange[0] = st;
count++;
}
else
{
string[] oldA = stringArrange;//将前一次得到的字符串暂存在oldA中
int i = oldA.Length + 1;
stringArrange = new string[i];//使字符数组的容量增加1个字符串
oldA.CopyTo(stringArrange, 0);//将oldA中的串拷到stringArrange[0]中
stringArrange[stringArrange.Length - 1] = st;
}
}
//将字符数组转换为字符串数组。即词法分析后的单词数组。
private string[] charArrayToStringArray(char[] getch)
{
char charTemp;//追踪单个的字符
string stringSave = "";// 存放一个分析得到的单词
//一次循环因得到一个单词。
int i = 0;
while (i < (getch.Length) && getch[i] != '\0')
{
charTemp = getch[i];
//由数字组成的单词。
if (charTemp >= '0' && charTemp <= '9')
{
stringSave = stringSave + charTemp.ToString();
i = i + 1;
int test1 = 0;
while (i < getch.Length && test1 == 0)
{
charTemp = getch[i];
if (charTemp >= '0' && charTemp <= '9')
{
stringSave = stringSave + charTemp.ToString();
i = i + 1;
}
else
test1 = 1;
}
stringToArrayString(stringSave);
}
stringSave = "";
//由字母开头数字和字母组成的单词。
if (charTemp >= 'a' && charTemp <= 'z' || charTemp >= 'A' && charTemp <= 'Z' || charTemp == '_')
{
stringSave = charTemp.ToString();
i = i + 1;
int test = 0;//判断循环是否结束,1 为结束。
while (i < getch.Length && test == 0)
{
charTemp = getch[i];
if (charTemp >= 'a' && charTemp <= 'z' || charTemp >= 'A' && charTemp <= 'Z'
|| charTemp == '_' || charTemp >= '0' && charTemp <= '9')
{
stringSave = stringSave + charTemp.ToString();
i = i + 1;
}
else
test = 1;
}
stringToArrayString(stringSave);
}
stringSave = "";
//由运算符组成的单词。
if (charTemp == '+' || charTemp == '-' || charTemp == '*'
|| charTemp == '/' || charTemp == '(' || charTemp == ')' || charTemp == '{'
|| charTemp == '}' || charTemp == '[' || charTemp == ']' || charTemp == ';'
|| charTemp == ':'|| charTemp == '%' || charTemp == '&' || charTemp == '?'
|| charTemp == '>' || charTemp == '<' || charTemp == ',' || charTemp == '!'
|| charTemp == '.' || charTemp == '=')
{
stringSave = stringSave + charTemp.ToString();
i = i + 1;
stringToArrayString(stringSave);
}
stringSave = "";
if (charTemp == ' ')
{
i++;
}
}
return stringArrange;
}
private string[,] stringArrayToTwoStringArray(string[] stringArray)
{
//存放单词标识后的结果。
string[,] twoArray = new string[2, 1];
//单词的标志
int j = 0;
//每循环一次,把一个单词归于一类,即前面加上一个数字。
for (int i = 0; i < stringArray.Length; i++)
{ //运算符 0
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] == "%" || 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);
}
//常量 1
else if (stringArray[i].ToCharArray()[0] >= '0' && stringArray[i].ToCharArray()[0] <= '9')
{
twoArray[0, j] = "0";//数字
twoArray[1, j] = stringArray[i];
this.oneArrayToTwo(ref twoArray, ref j);
}
// 变量 2
else
{
twoArray[0, j] = "1";
twoArray[1, j] = stringArray[i];
this.oneArrayToTwo(ref twoArray, ref j);
}
}
for (int t = 0; t < stringArrange.Length; t++)
{
stringArrange[t] = "";
}
count = 0;
return twoArray;
}
private void printString(string[,] twoStringArray)
{
//提示说明
this.fenxijieguo.Text = "符号标志:" + "\r\n" +
"0 -> 常量" + "\r\n" +
"1 -> 变量" + "\r\n" +
"2 -> 算符" + "\r\n" +
"3 -> 其它" + "\r\n" +
"===============\r\n";
//输出二维数组中的数据
for (int x = 0; x < twoStringArray.Length / 2 - 1; x++)
{
for (int y = 0; y < 2; y++)
{
if (y != 1)
{
this.fenxijieguo.Text = fenxijieguo.Text + twoStringArray[y, x] + ",";
}
else
{
this.fenxijieguo.Text = fenxijieguo.Text + twoStringArray[y, x] + " ";
this.fenxijieguo.Text = this.fenxijieguo.Text + "\r\n";
}
}
}
}
private void button清空内容_Click(object sender, EventArgs e)
{
this.shuru.Clear();
this.fenxijieguo.Clear();
}
private void button退出_Click(object sender, EventArgs e)
{
Application.Exit();
}
private void 打开文件ToolStripMenuItem_Click(object sender, EventArgs e)
{
openFileDialog1 = new OpenFileDialog();
openFileDialog1.Filter = "文本文件(*.txt)|*.txt";
openFileDialog1.Title = "打开要分析的源文件。";
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
System.IO.StreamReader sr = new System.IO.StreamReader(openFileDialog1.FileName);
this.shuru.Text = sr.ReadToEnd();
sr.Close();
}
}
private void 保存文件ToolStripMenuItem_Click(object sender, EventArgs e)
{
saveFileDialog1 = new SaveFileDialog();
saveFileDialog1.Filter = "文本文件(*.txt)|*.txt";
saveFileDialog1.Title = "保存分析结果.";
if (saveFileDialog1.ShowDialog() == DialogResult.OK)
{
System.IO.StreamWriter wr = new
System.IO.StreamWriter(saveFileDialog1.FileName);
wr.Write(this.fenxijieguo.Text);
wr.Close();
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -