⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 program.cs

📁 c#实现词法分析 只是实现简单的对类pascal的分析
💻 CS
字号:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace sy1_C_sharp
{
    class Program   //主程序执行流程
    {
        static void Main(string[] args)
        {
            //打开源文件
            string FileName;
            Console.WriteLine("请输入完整的文件路径:");
            //FileName=Console.ReadLine();
            FileName = "F:\\eg1.txt";
            FileStream fs = File.OpenRead(FileName);
            StreamReader sr = new StreamReader(fs);



            //输出代码
            //keyword  关键字 //1
            //identity 标识符//2
            //splitter 分隔符//3
            //operater 运算衔//4
            //constant 常量  //5
            //unknow   非法字符//6

            Console.WriteLine("源文件为:");
            while (sr.Peek() >= 0)
            {
                string myStr = sr.ReadLine();
                char[] chArray = myStr.ToCharArray();
                Checks(chArray);

            }
            Console.ReadKey();
        }

        static void Checks(char[] chArray)
        {
            StringBuilder strBuffer = new StringBuilder();

            for (int i = 0; i < chArray.Length; )
            {

                if (chArray[i] == ' ' || chArray[i] == '\n' || chArray[i] == '\t' || chArray[i] == '\r')
                {
                    if (i < chArray.Length - 1) i++;
                }
                if (chArray[i] >= 'A' && chArray[i] <= 'Z')                //如果开头是字母的
                {
                    strBuffer.Append(chArray[i]);

                    if (i < (chArray.Length - 1))                          //一直是字母
                    {
                        i++;
                        while (chArray[i] >= 'A' && chArray[i] <= 'Z')
                        {
                            strBuffer.Append(chArray[i]);
                            if (i < (chArray.Length - 1)) i++;
                            else
                            {
                                if (IsKeywords(strBuffer.ToString()))                //全字母的串是否关键字或标识符
                                {
                                    Console.WriteLine("1,{0}", strBuffer); strBuffer.Remove(0, strBuffer.Length);
                                }
                                else
                                    Console.WriteLine("2,{0}", strBuffer); strBuffer.Remove(0, strBuffer.Length);
                                return;
                            }
                        }
                    }
                    if (char.IsDigit(chArray[i]))                            //字母接数字
                    {
                        strBuffer.Append(chArray[i]);
                        if (i < (chArray.Length - 1))
                        {
                            i++;
                            while (char.IsDigit(chArray[i]))
                            {
                                strBuffer.Append(chArray[i]);
                                if (i < (chArray.Length - 1)) i++;
                                else
                                {
                                    Console.WriteLine("2,{0}", strBuffer); strBuffer.Remove(0, strBuffer.Length);
                                    return;
                                }
                            }
                        }
                    }
                    if (IsKeywords(strBuffer.ToString()))                //字母开头的串是否关键字或标识符
                    {
                        Console.WriteLine("1,{0}", strBuffer); strBuffer.Remove(0, strBuffer.Length);
                    }
                    else
                    {
                        Console.WriteLine("2,{0}", strBuffer); strBuffer.Remove(0, strBuffer.Length);
                    }
                }

                if (IsSplitter(chArray[i].ToString()))                   //判断分隔符
                {
                    strBuffer.Append(chArray[i]);
                    if (chArray[i] == ':')
                    {
                        if (i < (chArray.Length - 1))                   //:后若是=则为运算符
                        {
                            if (chArray[i + 1] == '=')
                            {
                                strBuffer.Append(chArray[i + 1]);
                                Console.WriteLine("4,{0}", strBuffer); strBuffer.Remove(0, strBuffer.Length);
                                i++;
                            }
                        }
                    }
                    else
                    {
                        Console.WriteLine("3,{0}", strBuffer); strBuffer.Remove(0, strBuffer.Length);
                    }
                    if (i < (chArray.Length - 1)) i++;
                    else
                    {
                        return;
                    }
                }
                

                if (IsRationnlOperaters(chArray[i].ToString()))  //判断关系运算符
                {
                    strBuffer.Append(chArray[i]);
                    if (chArray[i] == '<')
                    {
                        if (i < (chArray.Length - 1))
                        {
                            if (chArray[i + 1] == '=')
                            {
                                strBuffer.Append(chArray[i + 1]);
                                Console.WriteLine("4,{0}", strBuffer); strBuffer.Remove(0, strBuffer.Length);
                                i++;
                            }
                            if (chArray[i + 1] == '>')
                            {
                                strBuffer.Append(chArray[i + 1]);
                                Console.WriteLine("4,{0}", strBuffer); strBuffer.Remove(0, strBuffer.Length);
                                i++;
                            }
                        }
                    }
                    if (chArray[i] == '>')
                    {
                        if (i < (chArray.Length - 1))
                        {
                            if (chArray[i + 1] == '=')
                            {
                                strBuffer.Append(chArray[i + 1]);
                                Console.WriteLine("4,{0}", strBuffer); strBuffer.Remove(0, strBuffer.Length);
                                i++;
                            }
                            
                        }
                    }

                    if (i < chArray.Length - 1) i++;
                    else
                    {
                        Console.WriteLine("4,{0}", strBuffer); strBuffer.Remove(0, strBuffer.Length);
                        return;
                    }
                }




                if (IsMathsOpraters(chArray[i].ToString()))     //判断数学运算符
                {
                    strBuffer.Append(chArray[i]);
                    Console.WriteLine("4,{0}", strBuffer); strBuffer.Remove(0, strBuffer.Length);
                    if (i < (chArray.Length - 1)) i++;
                }

                if (char.IsDigit(chArray[i]))                            //判断数字开头的(即常量)
                {
                    strBuffer.Append(chArray[i]);

                    if (i < (chArray.Length - 1))
                    {
                        i++;
                        while (char.IsDigit(chArray[i]))
                        {
                            strBuffer.Append(chArray[i]);
                            if (i < (chArray.Length - 1)) i++;

                        }
                        Console.WriteLine("5,{0}", strBuffer); strBuffer.Remove(0, strBuffer.Length);
                    }
                }

                //判断非法字符

                /* else
                 {

                         strBuffer.Append(chArray[i]);
                         Console.WriteLine("6,{0}", strBuffer); strBuffer.Remove(0, strBuffer.Length);
                         //if (i < (chArray.Length - 1)) i++;
                         //else return;
                    
                 }*/





            }
        }

        static bool IsKeywords(string str)      //判断关键字的方法
        {
            string[] keywords = { "VAR", "PROCEDURE", "BEGIN", "WHILE", "DO", "IF", "THEN", "ELSE", "END", "INTEGER" };
            for (int i = 0; i < keywords.Length; i++)
            {
                if (String.Compare(str, keywords[i], true) == 0)
                    return true;
            }
            return false;
        }

        static bool IsSplitter(string strChArray)           //判断分隔符的方法
        {
            string[] splitters = { ",", ";", ".", ":", "(", ")" };

            for (int i = 0; i < splitters.Length; i++)
            {
                if (String.Compare(strChArray, splitters[i], true) == 0)
                    return true;
            }
            return false;
        }

        static bool IsRationnlOperaters(string strChArray)  //判断关系运算符的方法
        {
            string[] rationalopraters = { "<", "<=", "=", ">", ">=", "<>" };

            for (int i = 0; i < rationalopraters.Length; i++)
            {
                if (String.Compare(strChArray, rationalopraters[i], true) == 0)
                    return true;
            }
            return false;
        }

        static bool IsMathsOpraters(string strChArray)          //判断数学运算符的方法
        {
            string[] mathsopraters = { "+", "-", "*", "/", ":=" };
            for (int i = 0; i < mathsopraters.Length; i++)
            {
                if (String.Compare(strChArray, mathsopraters[i], true) == 0)
                    return true;
            }
            return false;
        }
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -