编译原理 实验3 算符优先分析
编译原理-实验3算符优先分析法
实验3《算符优先分析法设计与实现》实验学时: 2 实验地点:实验日期:
一、实验目的
加深对语法分析器工作过程的理解;加强对算符优先分析法实现语法分析程序的掌握;能够采用一种编程语言实现简单的语法分析程序;能够使用自己编写的分析程序对简单的程序段进行语法翻译。
二、实验内容
在实验1的基础上,用算符优先分析法编制语法分析程序,语法分析程序的实现可以采用任何一种编程语言和工具。
三、实验方法
先在算符栈置“$”,然后开始顺序扫描表达式,若读来的单词符号是操作数,这直接进操作数栈,然后继续读下一个单词符号。分析过程从头开始,并重复进行;若读来的是运算符θ2则将当前处于运算符栈顶的运算符θ1的入栈优先数f与θ2的比较优先函数g进行比较。
四、实验步骤
1.定义目标语言的语法规则;
2.求解预测分析方法需要的符号集和分析表;
3.依次读入实验一的分析结果,根据预测分析的方法进行语法分析,直到源程序结
束;
4.对遇到的语法错误做出错误处理。
五、实验结果
六、实验结论
#include "stdio.h"
#include "stdlib.h"
#include "iostream.h"
char data[20][20]; //算符优先关系
char s[100]; //模拟符号栈s
char lable[20]; //文法终极符集
char input[100]; //文法输入符号串
char string[20][10]; //用于输入串的分析
int k;
char a;
int j;
char q;
int r; //文法规则个数
int r1;
《编译原理(实验部分)》实验3_PL0语法分析
《编译原理(实验部分)》实验3_PL0语法分析
《编译原理》(实验部分)
实验3_PL0语法分析
一、实验目的
加深和巩固对于语法分析的了解和掌握;给出PL/0文法规范,要求编写PL/0语言的语法分析程序。
二、实验设备
1、PC 兼容机一台;操作系统为WindowsWindowsXP。
2、Visual C++ 6.0 或以上版本, Windows 2000 或以上版本,汇编工具(在Software 子目录下)。
三、实验原理
PL/O语言的编译程序,是用高级语言PASCAL语言书写的。整个编译过程是由一些嵌套及并列的过程或函数完成。语法分析是由过程BLOCK完成。采用自顶向下的递归子程序法。所产生的目标程序为假象栈式计算机的汇编语言。对目标程序的执行是由PASCAL语言书写的解释程序进行的。
四、实验步骤
实验代码
int lp=0;
int rp=0;
#define getsymdo if(-1==getsym()) return -1
#define expressiondo() if(-1==expression()) return -1
#define termdo() if(-1==term()) return -1
#define factordo() if(-1==factor()) return -1
int expression();
//语法分析
int factor()
{
if(sym!=ident &&sym!=number&&sym!=lparen)
{
err++;
if(err==1) printf("语法错误: \n");
第3章 语法分析-编译原理及实践教程(第3版)-黄贤英-清华大学出版社
• 常用的语法分析方法:
根据建立语法分析树的方法来分,有两大类,分四小类:
➢ 自顶向下分析法:
从文法的开始符号出发,向下推导(使用最左推导) ,尽 可能使用各种产生式,推导出与输入串匹配的句子,从 而建立语法树。
➢ 自底向上分析法:
• 文法是被用来精确而无歧义地描述语言的句子的构成方式. • 文法描述语言的时候不考虑语言的含义。
3.2.1 文法的定义
例1:有如下规则
<句子><主语><谓语> <主语><代词>|<名词> <代词>我 <名词>大学生 <谓语><动词><直接宾语> <动词>是 <直接宾语><代词>|<名词>
(表示由…组成)
<直接宾语> <代词>|<名词>
• 产生式的形式为:A α
左部符 号,非 终结符又称为一条规则
右部,可以含 有非终结符和
终结符
有时一个产生式不足以描述该语法范畴,就用多个产生式,
如算术表达式的描述为:(递归定义)
E i
E E * E
EE+E 相同左部的一个右部又称一个候选式
编译原理优先函数
编译原理优先函数
优先函数是编译原理中一种重要的算法,用于处理表达式的语法分析
和计算顺序的确定。它是一种上下文无关文法分析的方法,也被称为优先
关系矩阵或优先算符关系矩阵。
优先函数的核心思想是基于优先关系规则,根据运算符的优先级和结
合性,为每个运算符设置相应的优先级。根据优先级,可以确定表达式中
操作符之间的计算顺序,从而避免了二义性和歧义。
优先函数主要有两个作用:确定操作符的结合性和计算顺序。
首先,优先函数可以确定操作符的结合性,即一个运算符在表达式中
的使用方式。根据优先函数,如果一个运算符的优先级和结合性与其周围
的运算符相同,那么就符合该运算符的结合性规则。对于左结合的运算符,优先级较低的运算符在表达式中的位置越靠左;对于右结合的运算符,优
先级较低的运算符在表达式中的位置越靠右。通过确定结合性,可以避免
表达式的二义性。
其次,优先函数还可以确定操作符之间的计算顺序。对于优先级较高
的运算符,应该优先计算;对于优先级较低的运算符,应该等待高优先级
的运算符计算完成后再计算。通过确定计算顺序,可以确保表达式的计算
结果是按照运算符的优先级从高到低依次计算的,避免了歧义和计算结果
的错误。
优先函数的实现可以通过使用优先关系表来完成。优先关系表是一个
矩阵,用于存储每个运算符之间的优先关系。在表中,行和列分别表示运
算符,表格中的元素表示了对应运算符之间的优先关系。优先关系表中的
元素可以是“<”、“=”或“>”三种值,分别表示左优先、等优先或右优先。
通过构建优先关系表,可以确定每个运算符之间的优先关系。在语法分析时,遵循以下规则进行操作符的处理:
编译原理算符优先分析算法
算符优先分析算法
1.该实验实现算符优先分析算法,由于时间关系,尚未实现用程序计算FIRSTVT,LASTVT,因此本实验的各种非终结符及其之间的优先关系人为初始化。本实验参考例4.12及其优先关系表。
2.算符优先关系表参考课本74页表4.4
+ * id ( ) #
+ > < < < > >
* > > < < > >
id > > > >
( < < < < =
) > > > >
# < < < < =
3.结果如图
4.源代码
# include<stdio.h>
# include<stdlib.h>
# include<string.h>
# define MAX 50 //定义最大长度为50,可以变化
struct sst{
char s[MAX];
int ps;//栈顶终结符指针
int top;//栈顶指针
};
struct inputst{
char in[MAX];
int pin;//当前字符指针
};
//定义算符及其优先关系表
char ch[6] = {'+','*','i','(',')','#'};
char chrelation[6][6]={'>','<','<','<','>','>',
'>','>','<','<','>','>',
编译原理 实验报告实验二 语法分析(算符优先)
华北水利水电学院编译原理实验报告2012~2013学年第一学期2011 级计算机科学与技术专业
班级:2011179 学号:2011179 姓名:
一、实验题目:语法分析(算符优先分析程序)
(1)选择最有代表性的语法分析方法算符优先法;
(2)选择对各种常见程序语言都用的语法结构,如赋值语句(尤指表达式)作为分析对象,并且与所选语法分析方法要比较贴切。
二、实验内容
(1)根据给定文法,先求出FirstVt和LastVt集合,构造算符优先关系表(要求算符优先关系表输出到屏幕或者输出到文件);
(2)根据算法和优先关系表分析给定表达式是否是该文法识别的正确的算术表达式(要求输出归约过程)
(3)给定表达式文法为:
G(E’): E’→#E#
E→E+T | T
T→T*F |F
F→(E)|i
(4) 分析的句子为:
(i+i)*i和i+i)*i
三、程序源代
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<iostream.h>
#define SIZE 128
char priority[6][6]; //算符优先关系表数组
char input[SIZE]; //存放输入的要进行分析的句子
char remain[SIZE]; //存放剩余串
char AnalyseStack[SIZE]; //分析栈
void analyse();
int testchar(char x); //判断字符X在算符优先关系表中的位置
编译原理 算符优先分析实验报告
实验四、算符优先分析算法
姓名:
学号:
班级:
指导老师:
时间:
计算机与信息技术学院
程序功能描述
实现算符优先分析算法,完成以下描述算术表达式的算符优先文法的算符优先分析过程。
G[E]:E→E+T∣E-T∣T
T→T*F∣T/F∣F
F→(E)∣i
说明:终结符号i 为用户定义的简单变量,即标识符的定义。
(1)构造该算符优先文法的优先关系矩阵或优先函数;(2)输入串应是词法分析的输出二元式序列,即某算术表达式“实验项目一”的输出结果,输出为输入串是否为该文法定义的算术表达式的判断结果;(3)算符优先分析过程应能发现输入串出错。(4)设计两个测试用例(尽可能完备,正确和出错),并给出测试结果。
备注:程序中判断该输入串是否为该文法定义的算术表达式的结果,若是则输出“accept”,若不是则输出“error”。该二元式序列要以“#”为结尾。
主要数据结构描述
程序结构描述
程序测试:
测试1:(i+i*i)
输出:
输入二:i+i*ii
输出:
学习总结
算符优先文法关键点就在于判断各个终结符号的优先级,构造算符优先矩阵是个难点,程序里面没有实现,而是直接定义了优先矩阵,这是需要完善的地方,试试能不能在程序中动态地构造优先矩阵。另外对于算符优先文法,失败的条件是比较两个非终结符的优先关系,若优先关系表中为空,就返回error.
《编译原理教程》课后习题答案第三章语法分析
第三章 语法分析 3.3 已知文法G[S]为S→aSb|Sb|b,试证明文法
G[S]为二义文法。 【 解 答】 由 文 法G[S] :S→aSb|Sb|b ,对 句 子
aabbbb可对应如图3-1所示的两棵语法树。
第三章 语法分析
S aSb aSb
Sb b
S Sb aSb aSb b
图3-1 句子aabbbb对应的两棵不同语法树
wwwartcomcokrcompanylogo如果由左至右扫描到第一个可以看出这并不一定是最左素短语的开头因为由它开始并不一定是素短语在其内部还可能包含其他更小的素短语所以在算符优先分析算法中只有先找到最左素短语的尾即才返回来确定与其对应的头即
第三章 语法分析
第三章 语法分析
3.1 完成下列选择题:
S→(T) | aS′ S′→+S | ε T→ST′ T′→,ST′| ε 改造后的文法已经是LL(1)文法,不带回溯的递归子程序如下: void match (token t)
{ if ( lookahead==t) lookahead=nexttoken; else error ( ); }
第三章 语法分析 void S ( ) {
第三章 语法分析 【解答】 (1) 消除左递归后,文法G[D′]如下:
D→TL T→int|long|short L→idL
编译原理课程设计--算术表达式的语法分析及语义分析程序设计 精品
课程设计任务书
学生姓名:专业班级:
指导教师:工作单位:
题目: 算术表达式的语法分析及语义分析程序设计
1.目的
通过设计、编制、调试一个算术表达式的语法及语义分析程序,加深对语法及语义分析原理的理解,并实现词法分析程序对单词序列的词法检查和分析。2.设计内容及要求
算术表达式的文法:
(1)选择算符优先分析法完成以上任务,中间代码选用逆波兰式。
(2)写出算术表达式的符合分析方法要求的文法,给出分析方法的思想,完成分析程序设计。
(3)编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。
3.课程设计报告书的内容应包括:
(1)设计题目、班级、学号、姓名、完成日期;
(2)给出算术表达式的语法分析和语义分析的设计。
(3)简要的分析与概要设计;
(4)详细的算法描述;
(5)源程序清单;
(6)给出软件的测试方法和测试结果;
(7)设计的评价、收获与体会。
时间安排:
第18周,周1-周3下午,周5全天
指导教师签名:年月日
系主任(或责任教师)签名:年月日
1 课设要求
设计题目算术表达式转换成逆波兰式(用算符优先分析法)
1.1课程设计的目的
课程设计是对学生的一种全面综合训练,是与课堂听讲、自学和练习相辅相成的必不可少的一个教学环节。通常,设计题中的问题比平时的练习题要复杂,也更接近实际。编译原理这门课程安排的课程设计的目的是旨在要求学生进一步巩固课堂上所学的理论知识,深化理解和灵活掌握教学内容,选择合适的数据逻辑结构表示问题,然后编制算法和程序完成设计要求,从而进一步培养学生独立思考问题、分析问题、解决实际问题的动手能力。
编译原理教程课后习题答案——第三章
第三章语法分析
3.1 完成下列选择题:
(1) 文法G:S→xSx|y所识别的语言是。
a. xyx
b. (xyx)*
c. xnyxn(n≥0)
d. x*yx*
(2) 如果文法G是无二义的,则它的任何句子α。
a. 最左推导和最右推导对应的语法树必定相同
b. 最左推导和最右推导对应的语法树可能不同
c. 最左推导和最右推导必定相同
d. 可能存在两个不同的最左推导,但它们对应的语法树相同
(3) 采用自上而下分析,必须。
a. 消除左递 a. 必有ac归
b. 消除右递归
c. 消除回溯
d. 提取公共左因子
(4) 设a、b、c是文法的终结符,且满足优先关系ab和bc,则。
b. 必有ca
c. 必有ba
d. a~c都不一定成立
(5) 在规范归约中,用来刻画可归约串。
a. 直接短语
b. 句柄
c. 最左素短语
d. 素短语
(6) 若a为终结符,则A→α·aβ为项目。
a. 归约
b. 移进
c. 接受
d. 待约
(7) 若项目集Ik含有A→α· ,则在状态k时,仅当面临的输入符号a∈FOLLOW(A)时,才采取“A→α· ”动作的一定是。
a. LALR文法
b. LR(0)文法
c. LR(1)文法
d. SLR(1)文法
(8) 同心集合并有可能产生新的冲突。
a. 归约
b. “移进”/“移进”
c.“移进”/“归约”
d. “归约”/“归约”
【解答】(1) c (2) a (3) c (4) d (5) b (6) b (7) d (8) d
3.2 令文法G[N]为
G[N]: N→D|ND
D→0|1|2|3|4|5|6|7|8|9
编译原理算符优先语法分析实验报告
专题4_算符优先语法分析
李若森 13281132 计科1301
一、理论传授
语法分析的设计方法和实现原理;算符优先文法、最左素短语、算符优先矩阵、优先函数的基本概念;算符优先文法句型最左素短语的确定;算符优先分析算法的实现。
二、目标任务
实验项目
实现算符优先分析算法,完成以下描述算术表达式的算符优先文法的算符优先分析过程。
G[E]:
E→E+T|E-T|T
T→T*F|T/F|F
F→(E)|i
设计说明
终结符号i为用户定义的简单变量,即标识符的定义。加减乘除即运算符。
设计要求
(1)构造该算符优先文法的优先关系矩阵或优先函数;
(2)输入串应是词法分析的输出二元式序列,即某算术表达式“专题 1”的输出结果,
输出为输入串是否为该文法定义的算术表达式的判断结果;
(3)算符优先分析程序应能发现输入串出错;
(4)设计两个测试用例(尽可能完备,正确和出错),并给出测试结果。
任务分析
重点解决算符优先矩阵的构造和算符优先算法的实现。
能力培养
深入理解理论对实践的指导作用;基本原理、实现技术和方法的正确运用。
三、实现过程
OPG优先关系
设G是一OG(简单优先)文法,a,b∈Vt,U,V,W ∈Vn
(1)a = b 当且仅当OG有
形如U→….ab….或U→….aVb….的规则
(2)a < b 当且仅当OG有
形如U→….aW….的规则,而且W=+>b….或W=+>Vb…..
(3)a > b 当且仅当OG有
形如U→….Wb….的规则,而且W=+> …. a或W=+>….aV 若a,b之间至多存在上述三种优先关系之一,OG为OPG(算符优先)文法。
算符优先算法
算符优先算法
1. 算符优先算法简介
算符优先算法(Operator Precedence Parsing)是一种用于解析和计算表达式的
方法。它通过定义运算符之间的优先级和结合性来确定表达式的计算顺序,从而实现对表达式的准确解析和计算。
在算符优先算法中,每个运算符都被赋予一个优先级,表示其与其他运算符之间的优先关系。根据这些优先级规则,可以将一个表达式转化为一个操作符和操作数构成的序列,并按照一定的顺序进行计算。
2. 算符优先文法
在使用算符优先算法进行解析时,需要定义一个文法来描述运算符之间的关系。这个文法称为算符优先文法。
一个典型的算符优先文法由以下三部分组成:
1.终结符:表示可以出现在表达式中的基本元素,例如数字、变量名等。
2.非终结符:表示可以出现在表达式中但不能作为最终结果输出的元素,例
如运算符。
3.产生式:描述了如何将非终结符转化为终结符或其他非终结符。
通过定义合适的产生式规则,可以建立起非终结符之间的优先关系。这些优先关系决定了表达式中运算符的计算顺序。
3. 算符优先表
算符优先表(Operator Precedence Table)是算符优先算法的核心数据结构之一。它用于存储运算符之间的优先级和结合性信息。
一个典型的算符优先表由以下几部分组成:
1.终结符集合:包含所有可能出现在表达式中的终结符。
2.非终结符集合:包含所有可能出现在表达式中的非终结符。
3.优先关系矩阵:用于存储运算符之间的优先关系。矩阵中每个元素表示两
个运算符之间的关系,例如“<”表示左运算符优先级低于右运算符,“>”
编译原理 实验3 算符优先分析
编译原理实验3 算符优先分析
一、实验目的
通过设计编制调试构造FIRSTVT集、LASTVT集和构造算符优先表、对给定符号串进行分析的程序,了解构造算符优先分析表的步骤,对文法的要求,生成算符优先关系表的算法,对给定的符号串进行分析的方法。
二、实验内容
1. 给定一文法G,输出G的每个非终结符的FIRSTVT集和LASTVT集。
2. 构造算符优先表。
3. 对给定的符号串进行分析,包含符号栈,符号栈栈顶符号和输入串当前符号的优先级,最左素短语和使用的产生式和采取的动作。
三、程序思路
在文法框内输入待判断文法产生式,格式E->a|S,注意左部和右部之间是“->”,每个产生式一行,ENTER键换行。文法结束再输入一行G->#E#
1. 先做文法判断,即可判断文法情况。
2. 若是算符优先文法,则在优先表栏显示优先表。
3. 写入要分析的句子,按回车即可。
4. 在分析过程栏,可以看到整个归约过程情况
四、实验结果
FunctorFirst.h
#include<afx.h>
#include<iostream>
#include<fstream>
#include<string>
using namespace std;
#define rightlength 20
#define product_num 20 // 产生式最多个数
#define num_noterminal 26 // 非终结符最多个数
#define num_terminal 26 // 终结符最多个数
教学大纲_编译原理 张淑艳
郑州大学软件学院
《编译原理》课程标准
制定人:张淑艳
课程代码: 773033
课程名称(中文 / 英文):编译原理 / Compiler Principle
学时(实验学时)/ 学分:周5学时 / 4学分
课程性质:专业必修
先修课程:程序设计、计算机组成原理、数据结构、操作系统
后续课程:无
适用专业:
选用教材:书名:程序设计语言编译原理
作者:陈火旺,刘春林,谭庆平等编著
出版社:国防工业出版社
出版日期: 2007
一、教学目的与任务
通过对该课程的学习,使学生能够了解编译程序构造的一般原理、基本设计方法和主要实现技术。使学生掌握编译程序的五个逻辑阶段:在词法分析中,深入理解正规表达式与有限自动机的理论和不确定的有限自动机转化为确定有限自动机的方法;在语法分析中,理解上下文无关方法的概念,掌握自上而下分析和自下而上分析的方法,深入理解消除左递归、消除回溯、提取左因子的方法和LL(1)分析法;在语义分析和中间代码生成中,掌握属性文法和语法制导翻译的基本思想、中间代码的格式和语句翻译的方法;在优化和目标代码生成中,了解其基本方法。除此之外,还需对符号表管理以及运行时存储空间组织的管理方法加以了解。
二、教学方法与特色
在学习编译原理之前,首先要求学生对一些源语言(如C或Java)和目标机器有所了解。
在教学过程有,其方法和特色有:
(1)在介绍语言实现技术的同时,强调一些相关的理论知识,如形式语言和自动机理论、语法制导的定义和属性方法、类型论等。
(2)在介绍编译器各逻辑阶段的实现时,强调形式化描述技术。
(3)强调对编译原理和技术的宏观理解和把握,而不把读者的注意力分散到一些枝节的算法上。
编译原理-算符优先分析法
(5)当读到句子结束符$,栈中只剩下$N时,成功。
对4.12中的文法G[E]: E E+T|T T T*F|F F (E)|id
写出输入串id+id$的算符优先分析过程。
S栈
$ $id $N $N+ $N+id $N+N $N
优先关系 当前符号 输入流
4.3 自下而上分析法的一般原理
• 1 自下而上语法分析概述
基本思想:用一个寄存文法符号的栈,将一个 输入串反向归约至文法的开始符号。
特点:效率高、文法限制少。
1 自下而上语法分析概述
• 移进-归约过程实例。 例4.11 设有文法G[A]: (1)A aBcDe (2)B b (3)B Bb (4)D d
FIRSTVT
LASTVT
E
{+,*,(,id}
{+,*,),id}
T
{*,(,id}
{*,),id}
F
{(,id}
{),id}
4.4.4 算符优先分析算法的设计
• 0 算符优先分析法与规范归约的区别
算符优先分析法:
只考虑终结符之间的优先关系来确定可归 约串,而与非终结符无关。
规范归约:
自上而下最右推导的逆过程。
(1)id+id*id (2)E+id*id (3)E+E*id (4)E*id (5)E*E (6)E
编译原理第三章语法分析
1.FOLLOW集 (1)定义:非终结符A的FOLLOW集合 * * FOLLOW(A)={a|S …Aa… , a∈T},若S …A, 则#∈FOLLOW(A),其中S为开始符号
①#∈FOLLOW(S); ②A→αBC: 将FIRST(C)-{ε}加入FOLLOW(B); ③A→αB或A→αBC且ε∈FIRST(C),则将FOLLOW(A) 加入FOLLOW(B)。
第三章 语法分析
语法分析器的作用
源程序
词法分析器
记号流
语法分析器
分析树
前端其他部分
中间表示
符号表 管理器
出错 处理器
上下文无关文法(CFG)
定义:上下文无关文法是一个四元组G=(N,T,P,S) ① N是非终结符的有限集合; ② T是终结符的有限集合,且N∩T=Ф; ③ P是产生式的有限集合; ④ S是非终结符,是文法的开始符号。 例:定义上下文无关文法G=(N,T,P,S)如下: N={E} T={+,*,(,),-,id} S=E P: E→E+E 所有出现在产生 所有不出现在产 式左边符号的集 生式左边符号的 E→E*E 合 集合 E→(E) E→-E 缩写为: E→E+E|E*E|(E)|-E|id E→id
例:
id id
+
* id
语法树只反映句型的结构,忽略了推导句型的过程。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
编译原理实验3 算符优先分析
一、实验目的
通过设计编制调试构造FIRSTVT集、LASTVT集和构造算符优先表、对给定符号串进行分析的程序,了解构造算符优先分析表的步骤,对文法的要求,生成算符优先关系表的算法,对给定的符号串进行分析的方法。
二、实验内容
1. 给定一文法G,输出G的每个非终结符的FIRSTVT集和LASTVT集。
2. 构造算符优先表。
3. 对给定的符号串进行分析,包含符号栈,符号栈栈顶符号和输入串当前符号的优先级,最左素短语和使用的产生式和采取的动作。
三、程序思路
在文法框内输入待判断文法产生式,格式E->a|S,注意左部和右部之间是“->”,每个产生式一行,ENTER键换行。文法结束再输入一行G->#E#
1. 先做文法判断,即可判断文法情况。
2. 若是算符优先文法,则在优先表栏显示优先表。
3. 写入要分析的句子,按回车即可。
4. 在分析过程栏,可以看到整个归约过程情况
四、实验结果
FunctorFirst.h
#include
#include
#include
#include
using namespace std;
#define rightlength 20
#define product_num 20 // 产生式最多个数
#define num_noterminal 26 // 非终结符最多个数
#define num_terminal 26 // 终结符最多个数
struct Production
{
char Left;
char Right[rightlength];
int num;
};
struct VT
{
bool vt[num_noterminal][num_terminal];
};
struct Stack
{
char P;
char a;
};
class CMyDlg
{
public:CMyDlg();
void InputRule();
CString showLastVT();
CString showFirstVT();
CString shownoTerminal(char G[]);
CString showTerminal(char g[]);
CString showLeftS(char S[], int j, int k);
void InitAll();
CString showSentence(CString sen, int start);
CString showStack(char S[], int n);
void Initarry(char arry[], int n);
CString ProdtoCStr(Production prod);
int selectProd(int i, int j, char S[]);
void preFunctor(CString sen);
void insertFirstVT(Stack S[], int &sp, char P, char a);
void insertLastVT(Stack S[], int &sp, char P, char a);
void ShowPreTable();
void createPreTable();
char pretable[num_terminal][num_terminal];
bool like_Q(Production prod, char Q);
void createLastVT();
bool likeQ_(Production prod, char Q);
bool likeQa_(Production prod);
bool like_aQ(Production prod);
bool like_a(Production prod);
bool likea_(Production prod);
bool Dignose(char c);
int findg(char c);
int findG(char c);
void createFirstVT();
void createTerminal();
void createnoTerminal();
void buildProduction(CString s);
bool test(CString s);
void parse(); // 语法分析
CString gram; // 存放文法;
Production production[product_num];
VT FirstVT;
VT LastVT;
int locProduct; // 已有产生式个数
char G[num_noterminal];
char g[num_terminal];
int i_G;
int i_g;
CString m_sen;
};
FunctorFirst.cpp
#include"FunctorFirst.h"
CMyDlg::CMyDlg()
{
}
bool CMyDlg::test(CString s) // 测试是否是算符优先文法
{
bool t = 1;
for (int i = 0;i < s.GetLength() - 1;i++)
if (s[i] > 64 && s[i] < 91 && s[i + 1]>64 && s[i + 1] < 91)
{
t = 0;
break;
}
return t;
}
void CMyDlg::InputRule()
{
string infile;
string line;
cout <<" 请输入语法文件的路径:";
cin >> infile;
cout << endl;
ifstream input(infile.c_str());
if (!input)
{
cout << endl <<"###打不开文件,请确认输入的路径有效###"<< endl;