📄 form1.cs
字号:
Rem(注释)
Integer(整数) Long(长整数) Single(单精度小数) Double(双精度,小数) Boolean(布尔) String(字符串,文字)*/
//每循环一次,把一个单词归于一类,即前面加上一个数字。
for(int i=0;i<stringArray.Length;i++)
{
//关键字
if( stringArray[i] == "main"
|| stringArray[i] == "int"
|| stringArray[i] == "var"
|| stringArray[i] == "fload"
|| stringArray[i] == "double"
|| stringArray[i] == "void"
|| stringArray[i] == "char"
|| stringArray[i] == "class"
|| stringArray[i] == "const"
|| stringArray[i] == "bool"
|| 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);
}
//运算符
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 button3_Click(object sender, EventArgs e)
{
WordAnalyse();
StringBuilder sb = new StringBuilder();
foreach (string item in strList)
{
sb.Append(item).Append("\n" );
}
richTextBox3.Text = sb.ToString();
}
int j = 0;
StringBuilder sbError = new StringBuilder();
private void GramAnalyse()
{
sbError.Append("行").Append("\t").Append("错误信息!").Append("\n");
if (strList[j] != "begin")
{
sbError.Append(rowList[j] + 1).Append("\t").Append("开始应为begin").Append("\n");
}
j++;
if (Sentence())
{
if (strList[j] != "end")
sbError.Append(rowList[j] + 1).Append("\t").Append("应以end结束").Append("\n");
}
//else
//sbError.Append(rowList[j] + 1).Append("\t").Append("语句出错!").Append("\n");
}
private bool Sentence()//语句
{
if (fzSentence())
return true;
if (tjSentence())
return true;
else return false;
}
private bool fzSentence()//赋值语句
{
if (!Variable())//变量
return false;
j++;
if (strList[j] != ":=")//:=
{
return false;
}
j++;
if (expression()) return true;//表达式
else
{
sbError.Append(rowList[j] + 1).Append("\t").Append("表达式出错!").Append("\n");
return false;
}
}
private bool tjSentence()//条件语句
{
if (strList[j] != "if")//if
return false;
j++;
if (!expression())//表达式
{
sbError.Append(rowList[j] + 1).Append("\t").Append("表达式出错!").Append("\n");
return false;
}
if (strList[j] != "then")//then
{
sbError.Append(rowList[j] + 1).Append("\t").Append("应为then!").Append("\n");
return false;
}
j++;
if (Sentence()) return true;//语句
else
{
return false;
}
}
private bool expression()//表达式
{
if (!Variable()) //变量
return false;
j++;
while (strList[j] == "+")//+
{
j++;
if (!expression())//表达式
{
j--;
return false;
}
}
return true;
}
private bool Variable()//变量
{
if (strList[j] == "i")
{
return true;
}
else
{
return false;
}
}
#region 词法分析
List<string> strList;
List<int> typeList;
List<int> rowList;
private void WordAnalyse()//词法分析
{
strList = new List<string>();
typeList = new List<int>();
rowList = new List<int>();
int row = 0;
char[] arr = richTextBox1.Text.ToCharArray();
List<char> l = new List<char>();
string s;
bool letterStar = false; bool digitStart = false;
for (int i = 0; i < arr.Count(); i++)
{
if (isLetter(arr[i]))//字母
{
l.Add(arr[i]);
if (digitStart == true) label1.Text = "第" + row.ToString() + "行出错!";
if (letterStar == false && digitStart == false) letterStar = true;
}
else if (isDigit(arr[i]))//数字
{
l.Add(arr[i]);
if (letterStar == false && digitStart == false) digitStart = true;
}
else if (isoperate(arr[i]) == true)//运算符
{
s = new string(l.ToArray());
if (digitStart == true)
{
Save(row, 3, s);
}
else if (letterStar == true)
{
if (isKeyword(s))
Save(row, 1, s);
else
Save(row, 2, s);
}
letterStar = false; digitStart = false;
l.Clear();
if ((arr[i] == '<') && ((arr[i + 1] == '=') || (arr[i + 1] == '>')))
{
l.Add(arr[i]);
l.Add(arr[i + 1]);
i++;
}
else if ((arr[i] == '>') && (arr[i + 1] == '='))
{
l.Add(arr[i]);
l.Add(arr[i + 1]);
i++;
}
else
{
l.Add(arr[i]);
}
s = new string(l.ToArray());
Save(row, 4, s);
l.Clear();
}
else if (isSeperate(arr[i]))//分隔符
{
s = new string(l.ToArray());
if (digitStart == true)
{
Save(row, 3, s);
}
else if (letterStar == true)
{
if (isKeyword(s))
Save(row, 1, s);
else
Save(row, 2, s);
}
letterStar = false; digitStart = false;
l.Clear();
if (arr[i] == '\n') row = row + 1;//行数
if (!(arr[i] == ' ') && !(arr[i] == '\n') && !(arr[i] == '\t'))
{
if (arr[i] == ':' && arr[i + 1] == '=')
{
l.Add(arr[i]);
l.Add(arr[i + 1]);
i++;
}
else
{
l.Add(arr[i]);
}
s = new string(l.ToArray());
Save(row, 5, s);
l.Clear();
}
}
else
{
label1.Text = "第" + row.ToString() + "行非法字符!";
}
if (i == arr.Count() - 1)
{
s = new string(l.ToArray());
if (digitStart == true)
{
Save(row, 3, s);
}
else if (letterStar == true)
{
if (isKeyword(s))
Save(row, 1, s);
else
Save(row, 2, s);
}
letterStar = false; digitStart = false;
l.Clear();
}
}
}
private bool isSeperate(char c)//是否分隔符
{
bool boo = false;
switch (c)
{
case ',': boo = true; break;//逗号
case ';': boo = true; break;//分号
case '.': boo = true; break;//句号
case ':': boo = true; break;//冒号
case '(': boo = true; break;
case ')': boo = true; break;
case ' ': boo = true; break;
case '\n': boo = true; break;
case '\t': boo = true; break;
default: boo = false; break;
}
return boo;
}
private bool isKeyword(string str)//是否关键字
{
bool boo = false;
switch (str.ToUpperInvariant())
{
case "BEGIN": boo = true; break;
case "DO": boo = true; break;
case "ELSE": boo = true; break;
case "END": boo = true; break;
case "IF": boo = true; break;
case "THEN": boo = true; break;
case "VAR": boo = true; break;
case "WHILE": boo = true; break;
case "INTEGER": boo = true; break;
}
return boo;
}
private bool isoperate(char c)//是否操作符
{
//bool boo=false;
string str = "+-*/<=>";
if (str.Contains(c))
return true;
else return false;
//if (c == '+')
//{
// boo=true;
//}
//if (c == '-')
//{
// boo = true;
//}
//if (c == '*')
//{
// boo = true;
//}
//if (c == '/')
//{
// boo = true;
//}
//if (c == '<')
//{
// boo = true;
//}
//if (c == '=')
//{
// boo = true;
//}
//if (c == '>')
//{
// boo = true;
//}
//return boo;
}
private bool isLetter(char c)//是否字母或下划线
{
bool boo = false;
string str = "abcdefghijklmnopqrstuvwxyz_";
if (str.Contains(c))
{
boo = true;
}
string str1 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ_";
if (str1.Contains(c))
{
boo = true;
}
return boo;
}
private bool isDigit(char c)//是否数字
{
bool boo = false;
string str = "0123456789";
if (str.Contains(c))
{
boo = true;
}
return boo;
}
private void Save(int row, int type, string word)
{
rowList.Add(row);
typeList.Add(type);
strList.Add(word);
}
#endregion
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -