syntaxanalyser.cs
来自「编译原理语法分析和词法分析综合实验: 源程序、可执行程序、测试程序文件、程序运行」· CS 代码 · 共 264 行
CS
264 行
using System;
using System.Collections.Generic;
using regularExpression = System.Text.RegularExpressions;
namespace syn
{
class syntaxAnalyser
{
//RegularExpressions.CaptureCollection captures;
//int arrSubString_number = 10; //要编译的代码的子串数
System.Collections.ArrayList arrSubString; //要编译的代码的子串集
int index = 0;//当前子串索引
System.Windows.Forms.RichTextBox ric;
public int isSuccess = 0;
public syntaxAnalyser(System.Windows.Forms.RichTextBox ri)
{
arrSubString = Form1.subStringCollection;
ric = ri;
}
public void AnalyseCode()
{
string arrSubStringStart = (string)arrSubString[0] + (string)arrSubString[1] + (string)arrSubString[2] + (string)arrSubString[3] + (string)arrSubString[4] + (string)arrSubString[5] + (string)arrSubString[6] + (string)arrSubString[7] + (string)arrSubString[8] + (string)arrSubString[9] + (string)arrSubString[10] + (string)arrSubString[11];
if (!arrSubStringStart.Equals("#include<stdio.h>intmain(){"))
if (!arrSubStringStart.Equals("#include\"stdio.h\"intmain(){"))
if (!arrSubStringStart.Equals("#include<stdio.h>voidmain(){"))
if (!arrSubStringStart.Equals("#include\"stdio.h\"voidmain(){"))
{
isSuccess = 0;
ric.Text += ("syntax is wrong!\n");
return;
}
index = 12;
if(!((string)arrSubString[arrSubString.Count-1]).Contains("}"))
{
isSuccess = 0;
ric.Text += ("the code is not complete!\n");
return;
}
while (true)
{
if (index == arrSubString.Count - 1)
break;
if ((((string)arrSubString[12]).Equals("int")))
{
if (!test(index))
{
isSuccess = 0;
ric.Text += ("the illegal variableName!\n");
return;
}
index++;
}
else
{
//if (!test(index))
//{
isSuccess = 0;
ric.Text += ("the illegal variableName!\nor lack of sign,;\nor the expression is illegal!\n");
return;
//}
//index++;
}
}
isSuccess = 1;
ric.Text+=("parsing is passed!\n");
return;
}
//public System.Collections.ArrayList arrs;
public Boolean AnalyseDE(String arrSub) //扫描算术表达式的正确性
{
//int i = 0;
String pat = @"[a-zA-Z0-9_()]|[*/+-]";//第一步,判断包含的字符的正确性
regularExpression.Regex re = new regularExpression.Regex(pat, regularExpression.RegexOptions.Compiled);
regularExpression.Match mat = re.Match(arrSub);
while(true)
{
if (!mat.Success)
return false;
mat=mat.NextMatch();
if (mat.Index == arrSub.Length - 1)
break;
}
//string s = arrSub.Replace("(","");
//s = s.Replace(")","");
//第二步检验去除括号时算式的正确性
String pat1 = @"([1-9]*[0-9]+[.][0-9]+)|[0]|([1-9][0-9]*)|([a-zA-Z_]+[a-zA-Z0-9_]*)" + @"|[*/+-]" + @"|[()]";
string fi = arrSub.Replace("++","");
fi = fi.Replace("--","");
regularExpression.Regex re1 = new regularExpression.Regex(pat1, regularExpression.RegexOptions.Compiled);
regularExpression.Match mat1 = re1.Match(fi);
int var = 0, sign = 0;
while (mat1.Success)
{
if (Form1.CategoryCode(mat1.Value) > 27)
{
var++;
if (var != sign + 1)
return false;
}
else
if (Form1.CategoryCode(mat1.Value) < 21)
{
sign++;
}
mat1 = mat1.NextMatch();
}
if (var <= sign)
return false;
//return true;
//第三步圆括号的配对和位置的正确性
//string pat2 = @"([1-9]*[0-9]+[.][0-9]+)|[0]|([1-9][0-9]*)|([a-zA-Z_]+[a-zA-Z0-9_]*)" + @"|([*/+-])" + @"|[()]";
//regularExpression.Regex re2 = new regularExpression.Regex(pat2, regularExpression.RegexOptions.Compiled);
regularExpression.Match mat2 = re1.Match(fi);
int left = 0, right = 0, j = 0;//left,right表示左右括号数,j是当前匹配的id
while (mat2.Success)
{
if (Form1.CategoryCode(mat2.Value) == 25)
{
left++;
j--;
if (j / 2 == 1 || j / 2 == -1)
{
//System.Windows.Forms.MessageBox.Show("error!");
return false;
}
}
else
if (Form1.CategoryCode(mat2.Value) == 26)
{
right++;
j++;
if (j / 2 == 0)
{
//System.Windows.Forms.MessageBox.Show("error!");
return false;
}
}
j++;
mat2 = mat2.NextMatch();
}
if (left == right)
return true;
return false;
}
//测试下一个子串是否符合的被调用方法
public static Boolean isInvalid(String sss, String Text)
{
regularExpression.Regex re = new System.Text.RegularExpressions.Regex(sss);
if (re.IsMatch(Text))
return true;
return false;
}
//测试下一个子串是否符合
public Boolean test(int indexCurrent)
{
if (((string)arrSubString[indexCurrent]).Equals("int") || isInvalid(",", (string)arrSubString[indexCurrent]))
{
return isInvalid("[a-zA-Z_]", (string)arrSubString[indexCurrent + 1]);
}
if (isInvalid("[a-zA-Z_]", (string)arrSubString[indexCurrent]))
{
return isInvalid("[=,;]", (string)arrSubString[indexCurrent + 1]);
}
if (isInvalid("[=]", (string)arrSubString[indexCurrent]))
{
string s = ConvertSubString(indexCurrent + 1);
//Boolean ok = true;
Expression e = null;
//try
//{
e = new Expression(s);
// ok = e.CanCalculate();
//}
//catch
//{
// ok =false;
//}
//if (ok == false)
//{
ric.Text += e.ToString() + "\n";
//ric.Text+="Expression Calculation ERROR.\n";
//}
//else
//{
// //e.Token = eqToken;
// //express.Add(e);
// ric.Text += e.ToString()+"\n";
//}
//ric.Text += e.ToString()+"\n";
if (s.Equals(""))
return false;
return AnalyseDE(s);
}
if (isInvalid(";", (string)arrSubString[indexCurrent]))
{//修改
if (indexCurrent + 2 < arrSubString.Count)
if(isInvalid("[a-zA-Z_]", (string)arrSubString[indexCurrent + 1]) && !isInvalid("int", (string)arrSubString[indexCurrent+1]))
if(!isInvalid("[=]", (string)arrSubString[indexCurrent+2]))
return false;
return isInvalid("}", (string)arrSubString[indexCurrent + 1]) || isInvalid("[a-zA-Z_]", (string)arrSubString[indexCurrent + 1]);
}
if (isInvalid(",", (string)arrSubString[indexCurrent]))
return isInvalid("[a-zA-Z_]", (string)arrSubString[indexCurrent + 1]);
if (isInvalid("}", (string)arrSubString[indexCurrent]))
{
return true;
}
return false;
}
public void OutputError(string s)
{
switch(s)
{
case ",": System.Windows.Forms.MessageBox.Show("lack of ','?"); break;
case ";": System.Windows.Forms.MessageBox.Show("lack of ';'?"); break;
case "notvar": System.Windows.Forms.MessageBox.Show("variable is illegal!"); break;
case "synWro": System.Windows.Forms.MessageBox.Show("syntax is wrong!"); break;
case "exp": System.Windows.Forms.MessageBox.Show("expression is wrong!"); break;
}
System.Windows.Forms.MessageBox.Show("error!");
}//报语法错误
public String ConvertSubString(int to)//缓存部分子串
{
string s = "";
while (to < arrSubString.Count-1)
{
if (((string)arrSubString[to]).Equals(",") || ((string)arrSubString[to]).Equals(";"))
return "";
s += arrSubString[to++];
if (arrSubString[to].Equals(",") || arrSubString[to].Equals(";"))
{
index = to-1;
return s;
}
}
return "";
}
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?