当前位置: 首页 > news >正文

【编译原理】总结

核心

闭包,正则闭包

产生式(规则)

文法 G[S]=(V_{N}V_{T},P,S)      一组规则的集合

V_{N}:非终结符

V_{T}:终结符

P:产生式

S:开始符号

推导

归约

规范(最右)推导

规范(最左)归约

句型

句子

语言

仅含终结符号的句型是一个句子

语言是所有句子的集合

短语

简单(直接)短语

句柄

任意句型的最左简单(直接)短语为句柄

根据语法树,短语--子树,简单短语----只有父子两代的子树

正则文法与状态转换图

右线性文法

左线性文法(归约)

正规式

DFA

M=(S,\sum,f,S0,F)

S0:唯一的初始状态

f:从S\times \sum到S的单值部分映射

F:终止状态集合

NFA

M=(S,\sum,f,S0,F)

S0:非空的初始状态集

f:从S\times \sum^{*}2^{S}的子集的映像

正规式R与NFA

NFA->正规式

确定的自上而下分析

LL(1)文法的条件

  • 文法不含左递归
  • 对文法中每个非终结符的各个产生式的候选首符号集两两不相交
  • 对文法中每一个非终结符,若存在某个候选首符号集包含\varepsilon,则FIRST(A)\cap FOLLOW(A)=\Phi

消除左递归

(1)直接左递归

\textbf{P}\rightarrow \textbf{P}\alpha |\beta \\ P\rightarrow \beta \textbf{P'} \\ \textbf{P'} \rightarrow \alpha \textbf{P'} | \varepsilon

(2)间接左递归

消除文法中全部左递归算法(前提:文法不含回路)

  • 把文法中非终结符,按某种顺序进行排列(顺序任意)
  • 对每个非终结符用排在它前面的其他非终结符的产生式表示出来,并消除产生式中的左递归
  • 化简所得文法,即去掉多余产生式

FISRT集

FOLLOW集

根据所给语言,构造文法

构造一右线性文法,与如下文法等价:先写语言,状态转换图,右线性文法

NFA->DFA   子集构造法

\varepsilon -closure(I)                 move(I,\alpha )

I_{\alpha }=\varepsilon -closure(move(I,\alpha ))

NFA确定化

DFA最小化        划分

正规式R与NFA(构造正规式R的DFA)

消除直接左递归

\textbf{P}\rightarrow \textbf{P}\alpha |\beta \\ P\rightarrow \beta \textbf{P'} \\ \textbf{P'} \rightarrow \alpha \textbf{P'} | \varepsilon

基本知识点

【编译原理】一二章-CSDN博客

【编译原理】第三章 词法分析-CSDN博客

【编译原理】 第四章 自上而下语法分析-CSDN博客

【编译原理】第五章 自下而上语法分析-CSDN博客

课后题

【编译原理】第四章 习题-CSDN博客

【编译原理】第三章 习题_(1) {0,1}上的含有子串010的所有串;-CSDN博客

练习

求FIRST集、FOLLOW集,判断是否为LL(1)文法,构造LL(1)分析表

FIRST集:

E: {'(', 'i'}

E': {+, -, ε}

T: {'(', 'i'}

T': {'*', '/', ε}

F: {'(', 'i'}

A: {+, -}

M: {*, /}

FOLLOW集:

E: {$, )}

E': {$, )}

T: {+, -, $, )}

T': {+, -, $, )}

F: {*, /, +, -, $, )}

A: {'(', 'i'}

M: {'(', 'i'}

该文法是LL(1)文法,因为所有产生式的FIRST集不相交,且对于可以推导出ε的产生式,其FIRST和FOLLOW集无交集

非终结符+-*/()i$
EE→TE'E→TE'
E'E'→ATE'E'→ATE'E'→εE'→ε
TT→FT'T→FT'
T'T'→εT'→εT'→MFT'T'→MFT'T'→εT'→ε
FF→(E)F→i
AA→+A→-
MM→*M→/

LL(1)分析器是一种自顶向下的语法分析器,使用一个分析栈和输入缓冲区来进行分析。其工作原理如下:

1. 初始化时,栈底放置结束符$,然后将开始符号压入栈顶。输入缓冲区存放待分析的字符串,末尾加上$。

2. 不断从栈顶取出符号X:

a. 如果X是终结符,检查是否与当前输入符号匹配。如果匹配,弹出X并消耗输入符号;否则报错。

b. 如果X是非终结符,查找分析表M[X, a](a是当前输入符号),若表中有产生式X→α,将X弹出,将α逆序压入栈中;若表中无条目,报错。

3. 重复步骤2,直到栈中只剩下$,输入缓冲区也只剩下$,此时接受输入字符串;否则报错。

LL(1)分析器通过预测产生式来展开非终结符,每一步都根据当前栈顶符号和输入符号选择正确的产生式,因此要求文法满足LL(1)条件,即分析表每个条目至多有一个产生式,避免冲突。

构造正规式R的DFA

NFA确定化

DFA最小化

消除左递归

习题总结

由文法开始符号经0步或多步推导产生的文法符号序列是(句型)

编译原理通常经历(词法分析)、(语法分析)、语义分析和中间代码生成、(优化)、(目标代码生成)等几个阶段;其中第一个阶段是以(源程序)为输入,(单词符号)为输出;最后一个阶段是以(中间代码)为输入,(机器语言程序或汇编语言程序)为输出。同时(表格管理)和(出错管理)贯穿编译器的各个阶段

解释器与编译器的主要区别是:(编译程序生成目标代码,解释程序不生成目标代码)

高级语言到低级语言的翻译过程称为(编译)。汇编语言到机器语言的翻译过程称为(汇编)

1.正规表达式(\varepsilon |a|b)^{2}表示的集合是()

A.\left \{ \varepsilon ,ab,ba,aa,bb \right \}

B.\left \{ ab,ba,aa,bb \right \}

C.\left \{ a,b,ab,aa,ba,bb \right \}

D.\left \{ \varepsilon ,a,b,aa,bb,ab,ba \right \}

D

\left \{ \varepsilon ,a,b \right \} \left \{ \varepsilon ,a,b \right \}

\left \{ \varepsilon ,a,b,aa,bb,ab,ba \right \}

2.分析树的内部结点仅由()组成

A.开始符号和非终结符号

B.终结符号和非终结符号

C.非终结符号

D.终结符号

C

3.文法

S\rightarrow (L)|a \\ L\rightarrow L,S|S

的终结符号是()

A.S

B.S L

C.a,()

D.a,()|

C

4.NFA M所识别的语言是()

A.0型语言

B.上下文有关语言

C.上下文无关语言

D.正规语言

D

5.同正规式a*b*等价的文法是()

A.S\rightarrow aS|bS|\varepsilon

B.S\rightarrow aSb|\varepsilon

C.S\rightarrow aS|Sb|\varepsilon

D.S\rightarrow abS|\varepsilon

C

L(G)={a^{m}b^{n},a\geq 0,b\geq 0}

D

相关文章:

  • Java面向对象
  • Dify+Ollama+Deepseek+BGE-M3来搭建本地知识库实操
  • 单片机系统设计不同开发方式的优缺点(面包板,洞洞板,PCB板)
  • Python爬虫学习路径与实战指南 06
  • Linux--JsonCpp
  • CDGP主观题题库与范例解答
  • 【深度学习-Day 8】让数据说话:Python 可视化双雄 Matplotlib 与 Seaborn 教程
  • Qt开发经验 --- 避坑指南(11)
  • 数孪实战笔记(1)数字孪生的含义、应用及技术体系
  • powerbuilder9.0中文版
  • 23、Next.js:时空传送门——React 19 全栈框架
  • 选对第三方软件测试公司,项目验收成功率提升90%
  • 滑动窗口,438找出字符串中所有字母的异位词
  • Linux:线程同步与互斥
  • JAVA自动装箱拆箱
  • make和makefile的使用,以及写一个简单的进度条程序
  • DAMA第10章深度解析:参考数据与主数据管理的核心要义与实践指南
  • 挪度半身复苏小安妮模型QCPR成人半身急救心肺复苏模拟人
  • 使用python脚本连接SQL Server数据库导出表结构
  • “AI+城市治理”智能化解决方案
  • 习近平将出席中国—拉美和加勒比国家共同体论坛第四届部长级会议开幕式并发表重要讲话
  • 巴基斯坦总理:希望通过和平对话方式解决与印方问题
  • 宇树科技王兴兴:第一桶金来自上海,欢迎上海的年轻人加入
  • 中国金茂新任命三名副总裁,撤销区域公司
  • 巴基斯坦首都及邻近城市听到巨大爆炸声
  • “80后”赵亮出任上海普陀区委副书记