三、实验方案设计
? 正规式——>NFA——>DFA——>MFA 1.优先符关系表的定义
//行分别表示:'.','|','(',')','*','#' //列分别表示:'.','|','(',')','*','#'
char[,] relation = {{'>','>','<','>','<','>'}, {'<','>','<','>','<','>'}, {'<','<','<','=','<','E'}, {'>','>','E','>','>','>'}, {'>','>','E','>','>','>'}, {'<','<','<','E','<','='}};
2.栈定义
///
struct StatusStack {
public int start; public int end; }
StatusStack[] stack_ZT = new StatusStack[100];
///
13
/// DFA化简状态集合结构 /// struct Tstates {
public int[] data;//NFA的状态集
public int length;//个数从零开始统计 public bool mark;
public int status;//计数状态
public int accept;//标记开始状态(-1)或结尾状态(1) }
Tstates[] Tstateslt = new Tstates[100];
///
public int[] data; public int length;
public int status;//计数状态 }
Mstates[] Mstateslt = new Mstates[100];
? LR(0)算法分析 1.构造LR(0)项目集规范簇 (1)定义变量
string nonterminal = \; //保存非终结符
string terminal = \; //保存终结符
string[] grammer = null; //保存文法
List
struct itemsetsNode //项目集 {
public string no;
public List
class ItemNode {
string item; //活前缀 string nextSymbol; //后继符号 string nextStatus; //后继状态 }
14
(2)函数实现
char[] separator = { '\\r', '\\n' }; grammer = this.txtgrammer.Text.Split(separator, StringSplitOptions.RemoveEmptyEntries); //分割文法符号串 foreach (string tempStr2 in grammer) {
if (nonterminal.Contains(tempStr2[0]) == false) nonterminal += tempStr2[0]; }
itemsets = new List
itemsetsNode tempItemSetNode = new itemsetsNode(); tempItemSetNode.no = \; string tempStr = grammer[0];
tempStr = tempStr.Insert(tempStr.IndexOf('>') + 1, \); tempItemSetNode.itemsetsNodeValue = Item_Closure(tempStr); itemsets.Add(tempItemSetNode);
int k = 0;
while (k < itemsets.Count) {
foreach (ItemNode tempItemNode in itemsets[k].itemsetsNodeValue) {
//对每个项目进行处理 List
//若不是是接受态或可规约项,使str中的.向后移一位
string str = tempItemNode.Item;
int index = str.IndexOf('.');
if (index == str.Length - 1) //是接受态或可规约项 {
tempItemNode.NextSymbol = \; if (str[0] == nonterminal[0])
tempItemNode.NextStatus = \接受态\; else
tempItemNode.NextStatus = \规约\; continue; }
str = str.Remove(index, 1);
tempItemNode.NextSymbol = str[index].ToString(); if (nonterminal.Contains(tempItemNode.NextSymbol)
15
== false) //不是非终结符 {
if (terminal.Contains(tempItemNode.NextSymbol) == false)
terminal += tempItemNode.NextSymbol; }
str = str.Insert(index + 1, \);
tempItemsetsNode = Item_Closure(str); //求项目item的Closure
int row = Find(itemsets, tempItemsetsNode); //查找是否已存在该项目集
if (row == -1) //不存在该项目集 {
tempItemSetNode = new itemsetsNode();
tempItemNode.NextStatus = tempItemSetNode.no = itemsets.Count.ToString();
tempItemSetNode.itemsetsNodeValue = tempItemsetsNode;
itemsets.Add(tempItemSetNode); } else {
tempItemNode.NextStatus = row.ToString(); } } k++; }
display(); //将结果显示在listview中
2.构造LR(0)分析表 (1)定义变量
List
(2)函数实现
actionList = new List
gotoList = new List
foreach (itemsetsNode tempItemSetsNode in itemsets) {
16