{ "title": "class analyse_sentence", "description": "LL(1) 语法分析器的 C# 实现,包含单步和一键分析功能", "keywords": "LL(1), 语法分析器, C#, 单步分析, 一键分析", "content": "```c# using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;

public class analyse_sentence { string text; Select select; Stack analyse; Stack input; public List result_analys; public List result_input; public List result_parse;

public analyse_sentence(string text, Select select)
{
    this.text = text;
    this.select = select;
    this.analyse = new Stack();
    input = new Stack();
    result_analys = new List<string>();
    result_input = new List<string>(); 
    result_parse = new List<string>();
    analyseresult();
}

void analyseresult()
{
    var selects = select.getselects();
    analyse.Push('#');
    analyse.Push(selects.First().Key[0]);
    input.Push('#');
    for (int i= text.Length-1; i>=0; i--)
        input.push(text[i]);
    result_analys.Add(analyse.getString());
    result_input.Add(input.getString());

    while (true)
    {
        //如果分析栈栈顶元素为终结符
        if (IsTerminal(analyse.peek()))
        {
            //当两个栈都只剩下#时,说明匹配成功
            if(analyse.peek() == input.peek() && analyse.length()==1 && input.length()==1)
            {
                result_parse.Add("成功");
                return;
            }
            if(analyse.peek() == input.peek())
            {
                result_parse.Add("'" + analyse.peek()+"'"匹配");
                analyse.pop();
                input.pop();
                result_analys.Add(analyse.getString());
                result_input.Add(input.getString());
                continue;
            }
            else
            {
                result_parse.Add("失败");
                return;
            }
        }

        int flag = 0;
        string nofinal = analyse.peek().ToString();
        string final = input.peek().ToString();
        foreach(var parse in selects[nofinal])
        {
            if(parse.Value.Contains(final))
            {
                result_parse.Add(nofinal+"->" + parse.Key);
                analyse.pop();
                //当推出的产生式不为空时,对分析栈进行添加
                if (!parse.Key.Equals("#"))
                {
                    addanalyse(parse.Key);
                }
                result_analys.Add(analyse.getString());
                result_input.Add(input.getString());
                flag = 1; break;
            }
        }
        //说明该非终结符中没有可推导出该终结符的产生式
        if (flag == 0)
        {
            result_parse.Add("失败");
            return;
        }
    }
}

void addanalyse(String t)
{
    for(int i=t.Length-1; i>=0; i--)
    {
        analyse.push(t[i]);
    }
}

static bool IsTerminal(char symbol)
{
    return !char.IsUpper(symbol);
}

}

// ... (其余代码)

private void button7_Click(object sender, EventArgs e) { string text = textBox1.Text;

// 初始化分析栈和输入栈
analyseStack = new Stack<char>();
inputStack = new Stack<char>();

analyseStack.Push('#');
inputStack.Push('#');
for (int i = text.Length - 1; i >= 0; i--)
{
    inputStack.Push(text[i]);
}

// 初始化分析结果列表
resultAnalyse = new List<string>();
resultInput = new List<string>();
resultParse = new List<string>();

// 将开始符号加入分析栈
analyseStack.Push(nonterminals[0][0]);

analyze();

// 在界面第二行之后展示步骤、分析串、剩余输入串、推导所用产生式或匹配
listView4.Columns.Clear();
listView4.Items.Clear();
listView4.View = View.Details;


listView4.Columns.Add("步骤", 60, HorizontalAlignment.Center);
listView4.Columns.Add("分析串", 60, HorizontalAlignment.Center);
listView4.Columns.Add("剩余输入串", 80, HorizontalAlignment.Center);
listView4.Columns.Add("推导所用产生式或匹配", 150, HorizontalAlignment.Center);

button8.Enabled = true;
button9.Enabled = true;

}

private int step = 0; // 记录当前分析到第几步

// 单步显示分析信息 private void button8_Click(object sender, EventArgs e) { // 如果已经分析到最后一步或者分析出错,则不能继续单步显示 if (step >= resultParse.Count || resultParse[step] == "出错") { return; }

// 在listView4中添加一行,显示当前分析步骤、分析串、剩余输入串、推导所用产生式或匹配
ListViewItem item = new ListViewItem((step + 1).ToString());
item.SubItems.Add(resultAnalyse[step]);
item.SubItems.Add(resultInput[step]);
item.SubItems.Add(resultParse[step]);
listView4.Items.Add(item);

// 将步骤加一
step++;

}

// 一键显示分析信息 private void button9_Click(object sender, EventArgs e) { // 清空listView4 listView4.Items.Clear(); // 遍历分析结果列表,将分析信息添加到 listView4 中 for (int i = 0; i < resultParse.Count; i++) { ListViewItem item = new ListViewItem((i + 1).ToString()); item.SubItems.Add(resultAnalyse[i]); item.SubItems.Add(resultInput[i]); item.SubItems.Add(resultParse[i]); listView4.Items.Add(item); } step = resultParse.Count; // 更新步骤计数器 }

// ... (其余代码)

C# LL(1) 语法分析器 - 实现单步和一键分析功能

原文地址: https://www.cveoy.top/t/topic/oBOu 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录