`
zy3381
  • 浏览: 157679 次
  • 性别: Icon_minigender_1
  • 来自: 昆明
社区版块
存档分类
最新评论

引入新的非终结符改造直接递归文法

阅读更多
这个所谓的公式法,一开始着实看不懂,做了几个题目后再反复看了书上的例题,终于明白了怎么回事,主要是利用了等价文法的思想:文法到语言是一对第一,语言到文法是一对多,在描述同样的语言的情况下,可以有多种文法,所以存在不改变所定义的语言的情况下改造文法的可能。

1.假设有如下直接左递归
U→Ux|y          该文法所表示的语言为yx*

2.引入新的非终结符V
V→xV|空          该文法所表示的语言为x*

3.所以原来的文法可以改造为
①U→yV
②V→xV|空          该文法表示的语言为yx*

因为改造前后的两种文法所表示的语言相同,所以为等价文法

至此原来的直接左递归文法已变换为右递归,反向变换同理









分享到:
评论

相关推荐

    消除文法左递归

    左递归是指在文法(Grammar)中,一个非终结符(Non-terminal)可以无限制地直接递归调用自身,并且始终在递归链的左边。形式上,如果存在一个非终结符A,其产生式为A → αAβ或A → Aα,其中α和β是符号串(可能...

    编译原理之之消除左递归

    左递归是指在一个文法的产生式中,非终结符直接或间接地在其自身左侧出现的情况。例如,一个简单的算术表达式文法可能包含这样的产生式: ```antlr E -> E + T | T T -> T * F | F F -> number ``` 在这里,`E` 和...

    消除文法的左递归

    - 如果检测到直接左递归,则创建一个新的非终结符 `str2` 来代替原有的递归部分。 - 更新 `sentence` 映射,添加新的产生式,并删除原有的产生式。 - `solve()`:尚未完成的函数,用于调用其他辅助函数处理整个...

    ll(1)非递归文法模拟

    4. 归约:如果ACTION表指示归约,使用GOTO表找到归约后的非终结符对应的新状态,然后进行归约操作,更新栈顶元素。 5. 终止条件:当输入字符串耗尽且栈中只剩起始符号时,解析成功;否则,如果出现错误的输入符号或...

    检查非终结符能否推导出空(epsilon)

    ε-归约是指在文法中,一个非终结符可以不经过任何其他符号的转换直接推导为空串ε。如果一个非终结符能够进行ε-归约,那么它在文法中就有可能生成一个没有实际字符的子句,这在某些情况下可能是允许的,但在其他...

    消除文法的左递归.docx

    3. **引入新的非终结符**:为每个需要消除左递归的非终结符引入新的非终结符,以便将递归部分独立出来。 #### 4. 示例 考虑以下文法: ``` E → E + T | T T → T * F | F F → (E) | id ``` 这里,E和T都存在直接...

    消除文法的左递归.pdf

    2. **引入新的非终结符**:对于每一个直接左递归的非终结符 \(A\),引入一个新的非终结符 \(A'\)。 3. **改写产生式**:将形如 \(A \rightarrow A\alpha | \beta\) 的直接左递归产生式改写为 \(A \rightarrow \beta ...

    Chomsky文法类型判断及消除文法的左递归.txt

    2. **处理直接左递归**:对于直接左递归的情况,引入一个新的非终结符,并调整其他产生式的右部。 3. **消除间接左递归**:通过递归地替换产生式来消除所有可能的间接左递归情况。 4. **验证结果**:最后,程序会...

    ll(1)文法分析以及消除左递归

    - 通常采用的方法是通过引入新的非终结符来消除间接左递归。 #### 五、LL(1)分析程序设计 给定的部分代码示例展示了如何设计一个简单的LL(1)分析程序。这个程序主要涉及到以下几个方面: 1. **类的设计**:`...

    LL(1)文法的实现

    1. **读取文法**:从输入文件或硬编码中获取文法规则,并构建非终结符和终结符的集合。 2. **构造预测分析表**:根据文法规则计算每个非终结符的预测分析表。这涉及到求解First集和Follow集。 - **First集**:对于...

    消除左递归

    它指的是一个非终结符(非终结符号是文法中的抽象语法成分,与终结符相对)可以左导出自身,即存在产生式 A → αAβ,其中 A 是非终结符,α 和 β 是符号串(可能为空或包含其他非终结符和终结符)。这样的结构在...

    消除文法的左递归是编译原理中的一个概念

    1. 直接法:对于直接左递归,我们可以通过引入一个新的非终结符来替换递归的部分,使得新的文法不再具有左递归。以直接左递归的示例`A → Aa | b`为例,我们可以改写为`A → b A'`,`A' → a A' | ε`。这里,A'是非...

    c代码消除文法左递归_编译原理上机实验全过程

    左递归是指在文法中,非终结符的规则中出现直接或间接的左递归,例如,A → Aα / β,这种规则会导致文法分析器无法正确地解析输入串。因此,消除左递归是必要的。 在本实验中,我们将介绍如何消除左递归的方法。...

    算术表达式文法的递归下降语法分析程序

    递归函数设计是指设计每个非终结符对应的递归函数。该函数根据规则右部符号串的顺序编写,并实现递归下降语法分析的功能。 8. 语法分析步骤 语法分析步骤是指使用递归函数来实现语法分析的过程。该过程可以分为...

    编译原理 识别统计终结符及非终结符 (c语言)

    非终结符则是在文法中表示更复杂结构的符号,它们是由终结符组合而成的抽象概念。在C语言的文法中,“expr”(表达式)、“stmt”(语句)和“type”(类型)都是非终结符,它们分别代表了一条表达式、一条语句或一...

    消除文法的左递归.doc

    在文法中,**左递归**是一种特殊的结构形式,它指的是一个非终结符在其产生的序列中,自身直接位于序列的最左侧的情况。例如,在文法产生式 \(A \rightarrow A\alpha\) 中,\(A\) 直接出现在右侧序列的最左边,这就...

    上下文无关文法 求first集合

    First集合是文法中每个非终结符或终结符可能产生的第一个终结符的集合。换句话说,First集合包含从非终结符出发能推导出的所有可能的首字符。计算First集合时,我们需要遵循以下步骤: 1. 首先,First集合的初始值...

    ll1 文法分析 first follow select 集的 求解

    **Follow集**:Follow集定义了一个非终结符在文法中可能出现的位置,即在哪些符号之后可以接收到非终结符。如果在文法中找到形如A→αBβ的产生式,那么所有可能跟在β后面的符号(包括结束符号$)都会添加到Follow...

    zuo2.rar_消除左递归_编译原理文法

    通常需要重新组织文法,将递归路径通过新的非终结符传递,然后消除这些新非终结符的左递归。 四、编译原理文法的重要性 编译器是将源代码转换为目标代码的程序,而编译原理是研究这一过程的理论基础。理解并掌握...

Global site tag (gtag.js) - Google Analytics