编译原理语法分析LR1.doc

  1. 1、本文档共8页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
// LR1.cpp : Defines the entry point for the console application. // #include stdafx.h #include CharStack.h #include IntStack.h #include memory.h #include stdio.h #include stdlib.h #include malloc.h struct BNFNODE // 产生式节点 { char Left;????? // 产生式左部 char Right[MAX_DATA_LEN]; // 产生式右部 int?? RLen;????? // 产生式右边长度 } m_Bnf[MAX_DATA_LEN]; int m_nBnfLen; enum ACTIONTYPE // 动作类别 { Push,?? // 移进 Sumup,?? // 规约 Accept,?? // 接受 Error?? // 出错 }; struct LR1TABLE { int?? nStatus;?? // 状态 char CurChar;?? // 当前符号 ACTIONTYPE ActionType; // 动作类别 int?? nNextStatus; // 下一状态移进(push)或规约(sumup)产生式序号 } m_Lr1[MAX_DATA_LEN]; int?? m_nLr1Len; /***************************************************** * 以下是词法分析文件操作 ******************************************************/ // 清空链表 void ClearWords(WORDNODE *pHeader) { WORDNODE *pNode; while (pHeader != NULL) { ?? pNode = pHeader-pNext; ?? free(pHeader); ?? pHeader = pNode; } } // 增加结点 WORDNODE* AddNode(char c[], WORDNODE *pTail) { // c第0个字节为单词类别,第1个为逗号,第2个以后是值 WORDNODE *pNode = (WORDNODE *)malloc(sizeof(WORDNODE)); pNode-byType = c[0] - 0; pNode-pNext = NULL; int nChars = MAX_DATA_LEN - 2; memcpy(pNode-Value, c[2], nChars); pTail-pNext = pNode; return pNode; } bool ReadWords(char FileName[], WORDNODE *pHeader) { // 打开文件 FILE *f = fopen(FileName, r); if (f == NULL) { ?? ClearWords(pHeader); ?? return false; } WORDNODE *pTail = pHeader; char c[MAX_DATA_LEN]; // 读取数据 while (!feof(f)) { ?? fscanf(f, %s\n, c); ?? pTail = AddNode(c, pTail); ?? printf(%s\n, c); } // 关闭文件 fclose(f); // 增加一个结束符 c[0] = WT_OPERATOR + 0; c[1] = ,; c[2] = #; c[3] = \0; AddNode(c, pTail); return true; } /***************************************************** * 以下是文法文件操作 ******************************************************/ char *ReadFile(char FileName[], int *nLen) { // 打开文件 FILE *f = fopen(FileName, r); if (f == NULL) ?? return NULL; // 读取文件 char *pChar = (char *)malloc(sizeof(char) * MAX_DATA_LEN); // 读取数据 int nRead; *nLen = 0; while (!feof(f)) { ?? nRead = fread(pChar + *nLen

文档评论(0)

xingyuxiaxiang + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档