logo资料库

东北大学编译原理实验2 语法分析.docx

第1页 / 共12页
第2页 / 共12页
第3页 / 共12页
第4页 / 共12页
第5页 / 共12页
第6页 / 共12页
第7页 / 共12页
第8页 / 共12页
资料共12页,剩余部分请下载后查看
编译原理实验:语法分析 计算机 1002 班 岳明轩 20102682
编译原理实验:语法分析 一、实验目的 熟悉并设计一个表达式的语法分析器 二、实验内容 1. 设计表达式的语法语法分析器算法 2. 编写代码并上机调试运行通过 要求: 输入------------ 表达式 输出------------ 表达式语法是否正确 三、概要设计 1. 文法设计: 原文法: E T F | | E T E T T   * T F T F F  0 |1| 2 | 3| 4 | 5 | 6 | 7 | 8 | 9 | (   / | | E ) 因其不符合简单优先方法的要求(无法比较”E”和”(”的大小),故调整 原文法如下: | |  E E M E M M Z  E   M T  * T F T F F T  0 |1| 2 | 3| 4 | 5 | 6 | 7 | 8 | 9 | ( F  / | | Z ) 2. 由文法得到优先关系 相邻符号优先关系判断原则: s i   s s i  G  1) u j  s j
2) 3) 4) u u u     , G w    , v G    , v G    s w i vs j vw s  j     s   i s s  i i , s w   i  s j  s s j  s i  s j j 求 head 集和 tail 集,递归函数定义如下: tail 函数同理,此处省略。
3. 主函数流程
四、源代码 // gramma analysis.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include"conio.h" #include using namespace std; const int L_LENGTH=22; const int P_LENGTH=19; class production { public: production(){}; production(char c,string s); void equal(production p); char left; string right; }; production::production(char c,string s) { left=c; right=s; } void production::equal(production p) { left=p.left; right=p.right; } production p[P_LENGTH]; /////未通过////////////////////////////////////////////////////////////////////////// void error() { cout<
if(c=='q') exit(1); } } string head_temp=""; string tail_temp=""; ////得到字符 c 的 head 集////////////////////////////////////////////////////// string head(char c) { for(int i=0;i=65&&p[i].right[0]<=90) //如果是非终结符 { head_temp+=p[i].right[0]; head_temp+=head(p[i].right[0]); //递归调用 head } else head_temp+=p[i].right[0]; } } } return head_temp; } ////得到字符 c 的 tail 集///////////////////////////////////////////////////////////////// string tail(char c) { char t; for(int i=0;i=65&&p[i].right[p[i].right.length()-1]<=90) // 如果是非终结符 { tail_temp+=p[i].right[p[i].right.length()-1]; tail_temp+=tail(p[i].right[p[i].right.length()-1]); //递归调用 tail
} else tail_temp+=p[i].right[p[i].right.length()-1]; } } } return tail_temp; } ///////////////////////////////////////////////////////////////////// string list="ZEMTF+-*/()0123456789#"; int matrix[L_LENGTH][L_LENGTH]; //关系矩阵 /////给矩阵中 A,B 对应的位置赋值///////////////////////////////////// void set_value(char a,char b,int v) { int i=list.find(a); int j=list.find(b); if(i==-1||j==-1) error(); matrix[i][j]=v; } ////创建关系矩阵/////////////////////////////////////////// void create_relation() { for(int i=0;i1) { ////////////选取产生式长度多于一个字符的 for(int j=0;j='A') //////如果第一个字符是非终结符 {
string f_tail=tail(p[i].right[j]); for(int m=0;m='A') { string b_head=head(p[i].right[j+1]); for(int m=0;m='A')//第二个字符是非终结符 { string b_head=""; b_head=head(p[i].right[j+1]); for(int m=0;m
分享到:
收藏