编译原理-各章典型题型+思路求解

目录

第2章文法和语言习题

第3章词法分析习题

第4章自顶向下语法分析习题 

总结:

1.对于最左推导:

2.自上而下分析法:

3.目前来说,我们改写文法主要有两种手段:

4.FIRST集和FOLLOW集:

FIRST集:

FOLLOW集:

5.SELECT集:

6.LL(1)文法:

7.预测分析表的构建:

8.预测分析的过程:

第5章算符优先分析习题

总结:

1.语法分析的方法:

2.短语与直接短语:

3.优先关系:

4.算符文法:

5.算符优先文法:

6.FIRSTVT集与LASTVT集:

7.最左素短语:

8.规范规约:

第6章LR 分析习题(持续更新中)


第2章文法和语言习题

基础知识:

思路:


基础知识:

思路:


基础知识:

编译原理之 短语&直接短语&句柄 定义与区分_编译原理短语,直接短语,句柄-CSDN博客

思路:


题目:

基础解释: 

 简单来说:

上下文无关文法就是这个文法中所有的产生式左边只有一个非终结:

例如:S->Abc

上下文有关文法就是第一个产生式左边有不止一个符号

例如:Sa->Abc

 思路:


编译原理 —— 正规式、正规集和正则定义-CSDN博客

【20200401】编译原理课程课业打卡十二之求解正规文法对应正规式_正规式s=(o|10)*-CSDN博客

思路:

第3章词法分析习题

基础解释: 

思路:


 思路:


基础解释:

正规式->最小化DFA说明 - 知乎 (zhihu.com)

思路:


基础知识:

思路:

先写出满足条件的正规式,由正规式构造NFA,再把NFA确定化和最小化

对于正规式的构造:

题目给定为字符表有0、1两种字符,则我们可以得到(0|1)*的正规式。

又由于每一个1后面都有一个0,故每次出现1必然为10的形式

故得到正规式:(0|10)*

(答案给的正规式差不多,我们最终也可以得到化简的答案,因为)

第4章自顶向下语法分析习题 

基础知识:

对于不带回溯:采用提取公共因子的方法,即让候选首符号集变成两两不相交,不会出现读取一个一个符号后发现下一个符号不匹配又要回到上一个读取位置的情况。

推荐博客:

编译原理第四章总结_不带回溯的递归子程序是什么意思-CSDN博客

思路:

注意:

这里的第2问,笔者书写并不规范,因为当一个文法满足LL(1)条件的时候,我们才能构造一个不带回溯的递归子程序。故在第2问中应先判断改写后的文法G是不是LL(1)型文法,然后再书写不带回溯的递归子程序。


【20200415】编译原理课程课业打卡十五之求解预测分析表&分析输入串是否为文法句子_对文法g,进行改写,然后对每个非终结符写出不带回溯的递归子程序-CSDN博客


基础知识:

对于LL(1)文法的判断:

故对于LL(1)文法的判断流程为:先看文法是否存在左递归

构建非终结符的FIRST集和FOLLOW集

然后检查各个产生式SELECT集两两不相交

从定义上可以看出SELECT集不存在空集

对于第3点解释:当空串属于a的FIRST集的时候,如果a处于空串这种状态的时候,那么它的FOLLOW集此时也等价于为它的FIRST集。
注意:

关于FIRST集中的空串。简而言之,符号串必须广义推导成一个“纯纯的”空串。此时才将空串放入首符号集中。


总结:

这节的主要内容为给定文法,对它进行一系列的操作。(以下为粗略的总结,仅仅作为复习,详细细节还需要找到对应定义)

1.对于最左推导:

记住每次都是在保证正确的情况下,从最左边开始匹配即可

2.自上而下分析法:

从文法的开始符号出发,反复使用各种产生式,寻找与输入符号匹配的推导。

3.目前来说,我们改写文法主要有两种手段:

 消除直接左递归:为了防止从左边开始进行产生式匹配时出现一直左递归的情况,因为该方式的左边最终一定为一个终结符,故将终结符提前直接表示,重复递归的过程放到右边,方便对于自上而下分析法进行符号匹配(间接左递归:去环即可)

提取左因子:为了防止有多个产生候选式,选择了错误的候选式,导致会出现回溯问题的解决方案。解决方案:反复提取相同的公共左因子,构成新的非终结符,使每个非终结符的所有候选首符号集变成两两不相交

4.FIRST集和FOLLOW集:

FIRST集:

定义:FIRST集为当前非终结符推导出的第一个终结符号所构成的集合,也就是所有的第一个终结符号组合的集合。

构造过程:简单来说就是找第一个终结符,要注意的是对于空串的加入,一定要广义上全部推出为空(即最后推出来的结果,就是一个空集),才能加入。

作用:能够在后面进行预测分析表的时候,直接将表达式写入。简单可以理解为在读取字符进行输入的时候能够通过给定的字符快速的定位到需要用哪一个产生式(即通过第一个非终结符,找到所使用的产生式)。

FOLLOW集:

定义:FOLLOW集为当前非终结符后面的第一个终结符所构成的集合,也就是所有的它后面的第一个终结符的集合。

构造过程:首先需要将终结符放入到开始符号S中(把开始符号S看作一个整体那么该需要读入的字符串就可以看作($S$)),然后依次对于每一个非终结符,将它的第一个终结符放入到集合中。

作用:能够在后面进行预测分析表的时候,直接将表达式写入。简单可以理解为在读取字符进行输入的时候能够通过给定的字符快速的定位到需要用哪一个产生式(即通过第一个非终结符,找到所使用的产生式)。

作用其实和FIRST差不多,但要注意的是在预测分析表中,FOLLOW集只会在FIRST集存在空的时候,才会将FOLLOW集写入(我们可以这样理解:产生式为空,那么我们要根据的第一个字符串定位就等同于FOLLOW集,即该空产生式后面的第一个终结符)

5.SELECT集:

定义:产生式A→α的可选集是指可以选用该产生式进行推导时对应的输入符号的集合,记为SELECT( A→α )

如果 ε not∈ FIRST(α),  那么SELECT(A→α)= FIRST(α) 如果 ε ∈ FIRST(α), 那么SELECT(A→α)=( FIRST(α)-{ε} )∪FOLLOW(A)

作用:可以用于判断文法是否LL(1)文法(即判断下文LL(1)文法的满足条件的2、3条)

判断过程如下:

解释:简单来说,SELECT集即为该产生式能够推导产生的第一个终结符的所有集合。 通过SELECT交集的判断,就能判断是否存在相同首终结符的情况,进而判断是否为LL(1)文法

6.LL(1)文法:

LL(1)文字解释:

第一个L表示从左到右去扫描输入串

第二个L表示采用最左推导的方式(这是为什么我们要去掉直接左递归的原因,防止出现一直递推的问题)

1表示分析时,每一步只需要向前看一步即可(这也是为什么我们要提取左因子的原因,让我们能够直接对应表中的值进行推导,其具有唯一对应的关系)

满足条件:

⑴文法不含左递归

⑵文法中每个非终结符A的各个产生式的首终结符集两两不相交,即,若 A→ α1| α 2 |…| α n则      FIRST(αi )∩FIRST(αj )=φ

⑶文法中每个非终结符A若其首字符集中含有ε,则FIRST(αi )∩FOLLOW(A)= φ

7.预测分析表的构建:

对于A->a

首先对产生式右边构造FIRST(a)集,当FIRST(a)集中存在空集的时候,接下来就构造产生式左边非终结符的FOLLOW(A)集,然后根据以上两个集合去在预测分析表中书写对应位置的产生式。

注意这里的为什么要构造FOLLOW(A)集解释一下,当FIRST(a)集广义上都为空的时候,这个时候FOLLOW(A)集就等价于第一个非终结符。(因为我们的分析表就是根据第一个非终结符进行判断)

8.预测分析的过程:

设栈顶符号x和输入符号a

1.当x=a= $ 时,则表示分析成功,停止分析

2.当x=a not= $时,把X从STACK栈顶弹出,a指向下一个输入符号。这里的意思表示a之前指向的字符已经匹配,开始匹配下一个字符。

3.当x为非终结符的时候,查看分析表,找到对应位置的产生式,把x弹出栈顶,把产生式的右部符号,反向进栈(若为空,则不推入东西进栈)。这一步的意思就是通过预测分析表,从当前产生式的起点位置出发,因为当前文法为LL(1)文法,其保证分析时只需要向前看一步,故我们可以采用该方式进行推导。


第5章算符优先分析习题

基础知识:

编译原理------语法分析(二)自下而上的归约(算符优先,LR分析)_待约项目和归约项目-CSDN博客

注意:注意算符优先关系表的拓广文法:S'->$S$,可以通过该文法,蒋终结符与$的关系写入算符优先关系表中。


总结:

1.语法分析的方法:

简单来说:

自上而下即从开始符号开始,根据给定的字符串,判断要用什么产生式去推导,然后逐步推导出结果。主要包括递归下降分析法【即通过代码的方式表现出来】和 LL(1)预测分析法【通过消除左递归,消除回溯 计算FIRST、FOLLOW集合,构造预测分析表,然后根据预测分析表对于输入串进行判定】

自下而上是从输入串开始,对字符串进行读入,并根据给定的字符串,判断要用什么产生式去归约,最后逐步规约出结果。主要包括算法优先分析法【计算FIRSTVT和LASTVT集合 构造算符优先关系表,通过最左素短语进行规约】、规范规约【边输入单词符号,边进行规约】、LR分析法

2.短语与直接短语:

3.优先关系:

4.算符文法:

5.算符优先文法:

6.FIRSTVT集与LASTVT集:

简单来说
FIRSTVT集就是 一个终结符的优先级小于 后面所有非终结符 第一层递归 里面的 第一个终结符

LASTVT集就是 一个终结符的优先级大于 前面所有非终结符 第一层递归 里面的 第一个终结符

该两个集合的核心都是 对于在非终结符里面的终结符 大于 与非终结符相邻的终结符,大家可以理解成递归,非终结符就是一个递归程序,我们程序运行的时候肯定是先把最深处递归的内容处理好后,再网上递归,这样就最深处的递归程序里面的内容优先级比上一级的要大。

7.最左素短语:

最左素短语用于算符优先算法进行分析的归约操作。

8.规范规约:

简单来说,规范规约就是最右推导的逆过程,然后我们要记住规范规约每次归约的都为句柄即可

如下为句柄归约过程:

当处于该规约状态时没有采用 T->S 而是采用 T->T,S 就是因为 T,S 为当前句柄。

参考博客:

句柄和规范规约(超详细)-CSDN博客

第6章LR 分析习题(持续更新中)

总结:

1.LR(0)的项目规范族(等价于识别活前缀的DFA):

与识别活前缀的DFA的差别:

其实两者差不多,但项目规范族是一个表,而识别活前缀的DFA相当于是在项目规范族的基础上通过后继符号相连的一个图。

构造过程:

首先先写出基本项目集,然后它的闭包添加到当前状态中(等价于将非终结符的所有产生式添加进来),然后通过该项目集的后继符号,构成新的后继状态,重复上述过程。

这里我们可以简单理解一下项目规范族的作用:通过一个点,代表当前所在的位置,然后就将最右推导的全部可能到达的状态全部表现了出来,方便后续构建分析表,然后通过分析表进行预测要采用的推导。(这里笔者目前理解不够深切,总结有些粗略)

其中要将所有点后面的非终结符的产生式添加进来这一步骤是因为该非终结符的表达式,后面就是等价于点后所有的符号。

2.LR(0)文法:

定义:对一个文法的LR(0)项目集规范族不存在移进-归约冲突或归约归约冲突时,称这个文法为LR(0)文法 或者 LR(0)分析表不含多重定义时

3.分析表的ACTION(动作表)与GOTO(转换表):

ACTION:它表示当前状态下面临输人符号时应做的动作是移进、归约、接受还是出错,动作表的列标只包含终结符和$。

GOTO:表示在当前状态下面临文法符号时应转向的下一个状态,相当于识别活前级的有限自动机DFA的状态转换矩

注意:

1)记得对于增广文法的变换(保证文法的开始有且仅有一条产生式)

2)若项目S'→S·属于I,则置ACTION[k,$]为acc,表示接受。

3.SLR(1)文法:(又叫Simple LR(1)文法,即简单的LR(1)文法)

解决了LR(0)文法中移进规约冲突和归约归约冲突。

方法:FOLLOW集中有的内容才进行 reduce 操作,简单来说就是往后看一个,如果如果匹配才进行reduce操作。

注:

如果对于一个文法的LR(0)项目集规范族的某些项目集或LR(0)分析表中所含有的动作冲突都能用上述方法解决,则称这个文法是SLR(1)文法

这些模块有哪些要安装的 在数学建模竞赛中,Python 凭借其丰富的科学计算库和灵活性成为重要工具。以下是 Python 在数学建模中的核心应用领域及相关工具,按模块分类整理: --- ### **一、基础科学计算与数据处理** 1. **数值计算** - **NumPy**:矩阵运算、线性代数、随机数生成 - **SciPy**:积分/微分求解、优化算法、插值、傅里叶变换 - **SymPy**:符号计算(符号求导、方程解析解) 2. **数据处理** - **Pandas**:数据清洗、时间序列分析、表格操作 - **OpenPyXL**:Excel 文件交互 - **SQLAlchemy**:数据库连接(如需外部数据) --- ### **二、建模与算法实现** 1. **经典数学模型** - **Scikit-learn**:回归/分类/聚类(如线性回归、SVM、K-Means) - **Statsmodels**:统计模型(假设检验、时间序列ARIMA) 2. **优化问题** - **PuLP/CVXPY**:线性/整数规划建模 - **SciPy.optimize**:非线性规划求解- **GEKKO**:动态系统优化(化工、控制领域) 3. **图论与网络分析** - **NetworkX**:复杂网络建模(最短路径、PageRank算法) 4. **微分方程** - **ODEINT(SciPy)**:常微分方程数值解 - **FEniCS**:偏微分方程有限元法(高阶需求) --- ### **三、数据可视化** 1. **基础绘图** - **Matplotlib**:2D/3D静态图绘制 - **Seaborn**:统计图表美化(热力图、分布图) 2. **交互式可视化** - **Plotly**:动态可交互图表(地图、3D轨迹) - **Bokeh**:网页端交互可视化 3. **地理信息** - **Basemap/Cartopy**:地理空间数据可视化 --- ### **四、高级工具链** 1. **自动化建模** - **AutoML(TPOT/Auto-Sklearn)**:自动机器学习(时间紧迫时) 2. **高性能计算** - **Numba**:加速数值计算(基于JIT编译) - **Dask**:并行计算(大数据集处理) 3. **文档生成** - **Jupyter Notebook**:代码/公式/图表混合排版 - **Latex**:通过`pythontex`包与Python联动 --- ### **五、特殊场景工具** 1. **图像处理** - **OpenCV**:图像识别、特征提取(如卫星图像分析) 2. **文本分析** - **NLTK/Spacy**:自然语言处理(舆情类赛题) 3. **物理仿真** - **PyBullet**:刚体动力学模拟(机械控制类题目) --- ### **六、效率提升技巧** - **代码调试**:`pdb`调试器 + `logging`日志记录 - **版本控制**:Git + GitHub/Gitee 团队协作 - **环境管理**:`conda`虚拟环境隔离依赖项 - **API调用**:`requests`库获取实时数据(如天气、经济指标) --- ### **典型应用场景示例** 1. **预测类题目**:ARIMA(Statsmodels) + LSTM(PyTorch) 2. **优化调度题**:整数规划(PuLP) + 遗传算法(DEAP) 3. **评价模型题**:熵权法(NumPy) + TOPSIS(Pandas) 4. **动态系统题**:微分方程(SciPy) + 相空间图(Matplotlib) --- ### **注意事项** 1. **避免过度复杂**:优先使用成熟库而非重复造轮子 2. **结果可解释性**:关键步骤添加注释,便于论文复现 3. **资源管理**:大数据场景注意内存控制(使用生成器/分块读取) 建议赛前重点掌握:NumPy/Pandas数据处理链 + Matplotlib/Seaborn可视化 + Scikit-learn基础模型,这些覆盖80%常规需求。特殊题型(如神经网络、复杂优化)可针对性扩展。
最新发布
03-27
<think>嗯,用户问的是在数学建模竞赛中使用Python需要安装哪些模块。首先,我需要回顾之前提供的分类,把每个模块对应的安装包列出来。过用户可能仅想知道模块名称,还需要具体的安装命令或者注意事项。 首先,用户可能对Python环境熟悉,所以需要明确说明如何安装这些库,比如使用pip还是conda。另外,有些库可能名称和导入的名称同,比如OpenCV对应的包是opencv-python,需要指出。还有像Basemap已经再维护,可能需要用Cartopy代替,但安装过程可能复杂,需要提醒用户注意。 接下来,用户可能需要分门别类的列表,这样他们可以按需安装。例如基础科学计算部分,NumPy、SciPy、Pandas这些是必须的,而像SQLAlchemy可能只在需要数据库连接时才需要。需要明确每个模块的作用,帮助用户决定是否安装。 另外,有些库可能安装时依赖其他库或者系统工具,比如GEKKO可能需要安装额外的求解器,或者FEniCS的安装步骤比较复杂,可能需要单独说明。还有像Cartopy的地理空间库,安装时可能需要先安装GEOS和PROJ等依赖,这对新手来说可能是个问题,需要给出建议的安装方法,比如通过conda来管理。 还有,可视化部分中的Basemap已经过时,用户可能在网上找到旧的教程,应该建议使用Cartopy,并指出安装方法。同时,交互式可视化库如Plotly和Bokeh,可能需要额外的步骤,比如安装之后在Jupyter中使用需要安装扩展,这点也需要提及吗?或者用户可能只需要基础安装,暂时需要扩展功能。 另外,高级工具链中的AutoML工具如TPOT和Auto-Sklearn,这些库的安装可能需要较长时间,或者依赖特定版本的Python,需要提醒用户注意版本兼容性。例如,Auto-Sklearn可能支持最新的Python版本,这时候可能需要用虚拟环境或者指定版本。 特殊场景工具中的OpenCV,安装包是opencv-python,而有时候用户可能还需要opencv-contrib-python,是否需要区分?可能用户只需要基础安装,所以只提opencv-python即可。 物理仿真中的PyBullet,可能需要安装时使用pip install pybullet,但如果有3D渲染需求,可能需要额外的系统依赖,比如OpenGL等,可能需要用户自己处理,但可能超出一般用户的准备范围,所以暂时提,除非用户特别需要。 效率提升技巧中的环境管理,conda的使用可能需要指导,特别是创建虚拟环境和安装包的命令,比如conda create -n math_modeling python=3.9,然后激活环境安装。 用户可能还想知道哪些是必须安装的核心库,哪些是可选的。比如NumPy、Pandas、Matplotlib、SciPy、Scikit-learn这些几乎是必装的,而像GEKKO、FEniCS可能根据题目类型选择安装。 另外,文档生成中的Jupyter Notebook和LaTeX,Jupyter可以通过pip安装,但LaTeX可能需要系统级安装,比如TeX Live或者MiKTeX,这部分可能需要单独说明,因为是Python库,但用户可能需要结合使用。 还有,在注意事项里提到版本控制Git,这本身是Python模块,但用户可能需要配置,是否需要包括?可能需要,但可以提到团队协作时使用Git。 总结,用户的真实需求是得到一个清晰的安装列表,包含每个分类下的库名、安装命令,可能遇到的常见问题,以及哪些是核心推荐安装的。同时,用户可能需要一些安装建议,比如使用conda环境,优先安装哪些库,如何处理依赖问题等。需要分点列出,结构清晰,方便用户逐步安装。</think>在数学建模竞赛中,Python 所需的核心模块及安装指南如下(按功能分类整理): --- ### **一、必装基础模块** ```bash # 数值计算 pip install numpy # 矩阵运算 pip install scipy # 科学计算 pip install sympy # 符号计算 # 数据处理 pip install pandas # 数据清洗与分析 pip install openpyxl # Excel交互 # 可视化 pip install matplotlib # 基础绘图 pip install seaborn # 统计图表美化 ``` --- ### **二、常用建模工具** ```bash # 机器学习与统计 pip install scikit-learn # 分类/回归/聚类 pip install statsmodels # 统计模型 # 优化问题 pip install pulp # 线性/整数规划 pip install cvxpy # 凸优化建模 pip install scipy # 已包含非线性优化器 # 图论与网络 pip install networkx # 复杂网络分析 ``` --- ### **三、扩展工具(按需安装)** ```bash # 动态可视化 pip install plotly # 交互式图表 pip install bokeh # 网页端交互 # 地理信息(推荐使用conda安装) conda install cartopy # 替代过时的Basemap # 高性能计算 pip install numba # JIT加速计算 pip install dask # 并行处理大数据 # 自动化建模 pip install tpot # AutoML工具 # 特殊场景 pip install opencv-python # 图像处理 pip install gekko # 动态系统优化 pip install fenics # 偏微分方程(需先安装依赖) ``` --- ### **四、环境与效率工具** ```bash # 开发环境 pip install jupyter # 交互式笔记本 pip install ipython # 增强交互终端 # 协作管理 pip install gitpython # Git操作库 pip install requests # API数据获取 ``` --- ### **安装建议** 1. **优先使用Anaconda**: ```bash conda create -n math_modeling python=3.9 conda activate math_modeling ``` 通过 `conda install` 安装复杂依赖(如Cartopy、PyTorch等) 2. **常见问题解决**: - **安装失败**:尝试换国内镜像源(如清华源) ```bash pip install -i https://pypi.tuna.tsinghua.edu.cn/simple 包名 ``` - **库冲突**:使用虚拟环境隔离项目依赖 - **GPU加速**:需额外安装CUDA版的PyTorch/TensorFlow 3. **最小化安装推荐**: NumPy + Pandas + Matplotlib + SciPy + Scikit-learn 覆盖基础需求 --- ### **验证安装** ```python import numpy as np print(np.__version__) # 应输出版本号如1.23.5 ``` 建议赛前通过`requirements.txt`统一团队环境: ```bash pip freeze > requirements.txt # 生成依赖清单 pip install -r requirements.txt # 批量安装 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CTGU-Yoghurt

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值