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

📄 form1.cs

📁 C++编写的词法分析程序
💻 CS
字号:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Collections;

namespace cifafenxi
{
    public partial class Form1 : Form
    {
        private System.Windows.Forms.OpenFileDialog openFileDialog1;
        private System.Windows.Forms.SaveFileDialog saveFileDialog1;
        public void cifafenxiqi()
        {
            //
            // Windows 窗体设计器支持所必需的
            //
            InitializeComponent();

            //
            // TODO: 在 InitializeComponent 调用后添加任何构造函数代码
            //
        }

        public Form1()
        {
            InitializeComponent();
        }
        string stringTemp;
        char[] getch = new char[256];
        int count = 0;
        string[] stringArrange;
        private void button开始分析_Click(object sender, EventArgs e)
        {
            //得到想要的字符数组。
            getch = textToCharArray();

            //将字符数组,转换为词法分析后的单词数组。
            string[] stringArray = charArrayToStringArray(getch);

            //将单词数组分类,用数字标出各个单词所在的类别。
            string[,] twoStringArray = stringArrayToTwoStringArray(stringArray);

            //用于输出二维数组。
            printString(twoStringArray);
        }
        private char[] textToCharArray()
        {
            stringTemp = this.shuru.Text;
            char[] getch = stringTemp.ToCharArray();//要处理的字符都在getch这个数组中。
            return getch;
        }
        private void oneArrayToTwo(ref string[,] twoArray, ref int j)
        {
            string[,] tempArray = twoArray;
            twoArray = new string[2, j + 2];
            for (int x = 0; x < 2; x++)
            {
                for (int y = 0; y < j + 1; y++)
                {
                    twoArray[x, y] = tempArray[x, y];
                }
            }
            j = j + 1;
        }

        private void stringToArrayString(string st)
        {
            if (count == 0)
            {
                stringArrange = new string[1];
                stringArrange[0] = st;
                count++;
            }
            else
            {
                string[] oldA = stringArrange;//将前一次得到的字符串暂存在oldA中
                int i = oldA.Length + 1;
                stringArrange = new string[i];//使字符数组的容量增加1个字符串
                oldA.CopyTo(stringArrange, 0);//将oldA中的串拷到stringArrange[0]中
                stringArrange[stringArrange.Length - 1] = st;
            }
        }

        //将字符数组转换为字符串数组。即词法分析后的单词数组。

        private string[] charArrayToStringArray(char[] getch)
        {
            char charTemp;//追踪单个的字符
            string stringSave = "";//  存放一个分析得到的单词

            //一次循环因得到一个单词。
            int i = 0;

            while (i < (getch.Length) && getch[i] != '\0')
            {
                charTemp = getch[i];

                //由数字组成的单词。

                if (charTemp >= '0' && charTemp <= '9')
                {
                    stringSave = stringSave + charTemp.ToString();
                    i = i + 1;
                    int test1 = 0;
                    while (i < getch.Length && test1 == 0)
                    {
                        charTemp = getch[i];
                        if (charTemp >= '0' && charTemp <= '9')
                        {
                            stringSave = stringSave + charTemp.ToString();
                            i = i + 1;
                        }
                        else
                            test1 = 1;
                    }
                    stringToArrayString(stringSave);

                }

                stringSave = "";
         

                //由字母开头数字和字母组成的单词。
                if (charTemp >= 'a' && charTemp <= 'z' || charTemp >= 'A' && charTemp <= 'Z' || charTemp == '_')
                {
                    stringSave = charTemp.ToString();
                    i = i + 1;
                    int test = 0;//判断循环是否结束,1 为结束。
                    while (i < getch.Length && test == 0)
                    {
                        charTemp = getch[i];
                        if (charTemp >= 'a' && charTemp <= 'z' || charTemp >= 'A' && charTemp <= 'Z'
                            || charTemp == '_' || charTemp >= '0' && charTemp <= '9')
                        {
                            stringSave = stringSave + charTemp.ToString();
                            i = i + 1;
                        }
                        else
                            test = 1;
                    }
                    stringToArrayString(stringSave);
                }
               stringSave = "";
            
                
                //由运算符组成的单词。

                if (charTemp == '+' || charTemp == '-' || charTemp == '*'
                    || charTemp == '/' || charTemp == '(' || charTemp == ')' || charTemp == '{' 
                    || charTemp == '}' || charTemp == '[' || charTemp == ']' || charTemp == ';'
                    || charTemp == ':'|| charTemp == '%' || charTemp == '&' || charTemp == '?' 
                    || charTemp == '>' || charTemp == '<' || charTemp == ',' || charTemp == '!' 
                    || charTemp == '.' || charTemp == '=')
                {
                    stringSave = stringSave + charTemp.ToString();
                    i = i + 1;
                    stringToArrayString(stringSave);
                }

                stringSave = "";
               
              
                
                if (charTemp == ' ')
                {
                    i++;
                }
            }
            return stringArrange;
        }

        private string[,] stringArrayToTwoStringArray(string[] stringArray)
        {
            //存放单词标识后的结果。
            string[,] twoArray = new string[2, 1];
            //单词的标志
            int j = 0;


            //每循环一次,把一个单词归于一类,即前面加上一个数字。
            for (int i = 0; i < stringArray.Length; i++)
            {       //运算符 0
                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] == "%" || 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);
                }
                //常量 1
                else if (stringArray[i].ToCharArray()[0] >= '0' && stringArray[i].ToCharArray()[0] <= '9')
                    {
                        twoArray[0, j] = "0";//数字
                        twoArray[1, j] = stringArray[i];
                        this.oneArrayToTwo(ref twoArray, ref j);
                    }
                    // 变量 2
                else
                    {
                        twoArray[0, j] = "1";
                        twoArray[1, j] = stringArray[i];
                        this.oneArrayToTwo(ref twoArray, ref j);
                    }
            }
         
            for (int t = 0; t < stringArrange.Length; t++)
            {
                stringArrange[t] = "";
            }
            count = 0;
            return twoArray;
        }


        private void printString(string[,] twoStringArray)
        {
            //提示说明
            this.fenxijieguo.Text = "符号标志:" + "\r\n" +
                               "0 -> 常量" + "\r\n" +
                               "1 -> 变量" + "\r\n" +
                               "2 -> 算符" + "\r\n" +
                               "3 -> 其它" + "\r\n" +
                               "===============\r\n";

            //输出二维数组中的数据
            for (int x = 0; x < twoStringArray.Length / 2 - 1; x++)
            {
                for (int y = 0; y < 2; y++)
                {
                    if (y != 1)
                    {
                        this.fenxijieguo.Text = fenxijieguo.Text + twoStringArray[y, x] + ",";
                    }
                    else
                    {
                        this.fenxijieguo.Text = fenxijieguo.Text + twoStringArray[y, x] + " ";
                        this.fenxijieguo.Text = this.fenxijieguo.Text + "\r\n";
                    }
                }
            }

        }
        private void button清空内容_Click(object sender, EventArgs e)
        {

          
            this.shuru.Clear();
            this.fenxijieguo.Clear(); 
        }

        private void button退出_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }

        private void 打开文件ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            openFileDialog1 = new OpenFileDialog();
            openFileDialog1.Filter = "文本文件(*.txt)|*.txt";
            openFileDialog1.Title = "打开要分析的源文件。";

            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                System.IO.StreamReader sr = new System.IO.StreamReader(openFileDialog1.FileName);
                this.shuru.Text = sr.ReadToEnd();
                sr.Close();
            }
        }

        private void 保存文件ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            saveFileDialog1 = new SaveFileDialog();
            saveFileDialog1.Filter = "文本文件(*.txt)|*.txt";
            saveFileDialog1.Title = "保存分析结果.";
            if (saveFileDialog1.ShowDialog() == DialogResult.OK)
            {
                System.IO.StreamWriter wr = new
                 System.IO.StreamWriter(saveFileDialog1.FileName);
                wr.Write(this.fenxijieguo.Text);
                wr.Close();
            }
        }
    }
}

⌨️ 快捷键说明

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