📄 complier.cs
字号:
return stringAdd;
case ':':
if (stringAdd.Trim() != "") //有可能是冒号前面的标识符与冒号之间没有空格符,同样可以处理
{
Look(stringAdd);
stringAdd = "";
stringAdd = stringChar.ToString();
}
else
{
stringAdd = stringChar.ToString();
}
beginString = false;
return stringAdd;
//case 'n':
// if (stringAdd.Trim() == @"\")
// {
// stringAdd +=stringAdd.Trim()+ stringChar;
// Look("\\n");
// stringAdd = "";
// beginString = true;
// }
// else
// {
// stringAdd += stringChar;
// beginString = false;
// }
// return stringAdd;
}
//if (stringChar.ToString().Trim()=="\\") //对回车符"\"的处理
// {
// if (stringAdd.Trim().Length != 0)
// {
// MessageBox.Show(stringAdd);
// Look(stringAdd);
// stringAdd = stringChar.ToString();
// beginString = false;
// }
// else
// {
// stringAdd = stringChar.ToString();
// beginString = false;
// }
// return stringAdd;
// }
//需要判断此时字符串是否是“>”和字符“<”
if(stringAdd.Trim().EndsWith("<",true,null))
{
Look("<");
stringAdd="";
beginString=true; //说明下个字符串的拼接是从第一个开始拼接的
return stringAdd;
}
else if (stringAdd.Trim().EndsWith(">", true, null))
{
Look(">");
stringAdd = "";
beginString = true;
return stringAdd;
}
//else if ((stringAdd.Trim().EndsWith("+", true, null)) || (stringAdd.Trim().EndsWith("-", true, null)) || (stringAdd.Trim().Trim().EndsWith("*", true, null)) || (stringAdd.Trim().EndsWith("/", true, null)) || (stringAdd.Trim().EndsWith(".", true, null)))
//{
// Look(stringAdd); //有可能代码中间字符串的开头第一个是操作符的话,要可以识别的
// if (stringChar!=' ')
// {
// stringAdd = stringChar.ToString();
// }
// else
// {
// stringAdd="";
// }
// beginString = true;
// return stringAdd;
//}
else //除了以上符号“<”和“>”和“:=”等的情况
{
if (Char.IsNumber(stringChar) == true) //如果是数字,无需判断stringAdd的开始符号是否是数字
{
stringAdd += stringChar;
}
else if (Char.IsLetter(stringChar) == true)//如果是字母,需判断stringAdd的开始符号是否是数字
{
// MessageBox.Show(stringAdd);
if (stringAdd.Trim().Length != 0)
{
if ((Char.IsNumber(stringAdd.Substring(0, 1), 0)) == true) //若首位是数字
{
Look(stringAdd); //说明此时为一个数字
stringAdd = stringChar.ToString();
beginString = true;
}
else if ((Char.IsLetter(stringAdd.Substring(0, 1), 0)) == true) //如果首位是字符
{
stringAdd += stringChar;
}
}
else
{
stringAdd = stringAdd.Trim();
stringAdd += stringChar;
}
}
else //除了以上情况的都是非法字符
{
if (stringAdd.Trim().Length > 0)
{
Look(stringAdd);
}
stringAdd = stringChar.ToString();
ErrorString = false;
MessageBox.Show(stringChar.ToString(), "出现非法字符!");
}
}
}
return stringAdd;
}
//查找模块,查保留字表,检查保留字表中的第一列是否含有该字符串
private void Look(string stringWord)
{
for (int i = 0; i <=StringCodeWord.GetUpperBound(0); i++)
{
if (String.Compare(StringCodeWord[i, 0].ToString(), stringWord, true) == 0) //表示含有此关键字
{
stringOut[0] = StringCodeWord[i, 0];
stringOut[1]=StringCodeWord[i,1];
OutWord(stringOut);
return;
}
}
//如果保留字中没有该字符串,说明该字符串为常量或者标识符
if (CheckStringIsNumber(stringWord)) //说明为数字
{
string[] strTemp = new string[2];
strTemp[0] = stringWord;
strTemp[1] = "18";
OutWord(strTemp);
return;
}
else if ((stringWord.Trim() != string.Empty)&&(CheckString(stringWord) == true) ) //说明为一个标志位
{
string[] strTemp = new string[2];
strTemp[0] = stringWord;
strTemp[1] = "17";
OutWord(strTemp);
return;
}
else //说明是非法字符
{
if (stringWord.Trim().Length != 0)
{
ErrorString = true; //给出标识,表示有非法字符
//sw1.WriteLine(stringWord);
//sw1.Flush();
MessageBox.Show("查询字中出现非法字符!",stringWord);
}
}
}
//判断一个字符串是否是字符串
private bool CheckString(string str)
{
if (Char.IsLetter(str, 0) == true)
{
for (int i = 1; i < str.Length; i++) //开头是字母,后面是数字或者字母
{
if ((Char.IsLetter(str, i) == true) || ((Char.IsNumber(str, i))==true))
{
continue;
}
else
{
return false;
}
}
return true;
}
else
{
return false;
}
}
//判断一个字符串是否是数字
private bool CheckStringIsNumber(string str)
{
if (Char.IsNumber(str, 0) == true) //如果字符串的第一个十数字的话才可以判断是否是数字
{ //如果是数字,返回true,否则返回false
try
{
Int32.Parse(str);
return true;
}
catch
{
return false;
}
}
else
{
return false;
}
}
//输出单词模块
private void OutWord(string[] strOut)
{
ListViewItem subItems = new ListViewItem(strOut);
listViewCode.Items.Add(subItems);
}
//开始编译源文件,查找保留字表
private void buttonComplie_Click(object sender, EventArgs e)
{
countErrorLine = 0; //每次编译都要给countErrorLine赋值,不然会与上次的值一直递加
listViewCode.Items.Clear();
ErrorString = false; //设置为false,表示为没有错误行,默认值为false
toolStripStatusLabelName.Text = "正在编译..."; //编译的时候,给出"正在编译..."状态提示
char[] bufferChars = new char[richTextBoxSourceFile.Text.ToCharArray().Length];
bufferChars = richTextBoxSourceFile.Text.ToCharArray();
progressBar1.Maximum = bufferChars.Length; //设置进度条的最大值
progressBar1.Minimum = 0;
for (int i = 0; i < bufferChars.Length; i++)
{
if (ErrorString == false)
{
Scan(bufferChars[i]);
progressBar1.Value = i;
}
else //如果有错误行产生的话,就停止编译,listViewCode清空
{
progressBar1.Value = 0;
toolStripStatusLabelName.ForeColor = Color.DarkRed;
toolStripStatusLabelName.Text = "在第" + Convert.ToString(countErrorLine) + "行附近发现有非法字符";
richTextBoxSourceFile.SelectedText = stringAdd;
listViewCode.Items.Clear();
return; //停止执行
}
}
if (ErrorString == true) //最后一个字符如果是非法字符,需要这检测,最后一个符号会使ErrorString == true
{
listViewCode.Items.Clear();
toolStripStatusLabelName.ForeColor = Color.DarkRed;
toolStripStatusLabelName.Text = "在第" + Convert.ToString(countErrorLine) + "行附近发现有非法字符";
richTextBoxSourceFile.Select(countChar, 1);
return;
} //程序不用向下执行了
//int j = 0;
//FileStream fs = File.OpenRead(stringPath);
//StreamReader sr = new StreamReader(fs, System.Text.Encoding.UTF8); //注意编码要与源文件中的一致
//char[] buffer = new char[1];
//while (sr.Read(buffer, 0, 1) > 0) //读入的是一个字节,
//{
// Scan(buffer[0]);
// j++;
// //MessageBox.Show(((int)(buffer[0])).ToString());
// //System.Threading.Thread.Sleep(100);
//}
else
{
if (stringAdd.Trim().Length > 0) //如果stringAdd去空不为空的话,说明还有最后一个字符串没有解析
{
try
{ //上边的循环查询中,如果最后一个是字符串的话,将不会查询
Look(stringAdd);
stringAdd = "";
beginString = true;
toolStripStatusLabelName.ForeColor = Color.Pink;
toolStripStatusLabelName.Text = "编译已完成,没有发现错误!";
}
catch
{
ErrorString = true;
listViewCode.Items.Clear();
toolStripStatusLabelName.ForeColor = Color.DarkRed;
toolStripStatusLabelName.Text = "在第" + Convert.ToString(countErrorLine) + "行附近发现有非法字符";
richTextBoxSourceFile.SelectedText = stringAdd;
}
}
}
}
//文本框在输入的时候,给出“正在输入”的状态信息
private void richTextBoxSourceFile_TextChanged(object sender, EventArgs e)
{
toolStripStatusLabelName.Text = "正在输入...";
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -