(重庆理工大学计算机学院)编译原理课程设计报告

发布时间 : 星期五 文章(重庆理工大学计算机学院)编译原理课程设计报告更新完毕开始阅读

三、实验方案设计

? 正规式——>NFA——>DFA——>MFA 1.优先符关系表的定义

//行分别表示:'.','|','(',')','*','#' //列分别表示:'.','|','(',')','*','#'

char[,] relation = {{'>','>','<','>','<','>'}, {'<','>','<','>','<','>'}, {'<','<','<','=','<','E'}, {'>','>','E','>','>','>'}, {'>','>','E','>','>','>'}, {'<','<','<','E','<','='}};

2.栈定义

///

/// NFA状态栈 ///

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];

///

/// MFA状态集 /// struct Mstates {

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 itemsets = null; //项目集规范簇

struct itemsetsNode //项目集 {

public string no;

public List itemsetsNodeValue; }

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 tempItemsetsNode = null;

//若不是是接受态或可规约项,使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 actionList = null; //存放action表的内容 List gotoList = null; //存放goto表的内容

(2)函数实现

actionList = new List();

gotoList = new List(); erminal += \; //遍历项目集规范簇

foreach (itemsetsNode tempItemSetsNode in itemsets) {

16

联系合同范文客服:xxxxx#qq.com(#替换为@)