?? 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 + -