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 + -
显示快捷键?