文法改进(消除左递归)

  在上次的文法中有存在左递归的情况,将会影响以后的语法分析使用,所以需要消除左递归,以便于语法分析使用。

<程序> → <外部声明> <程序>`

<程序>`→<程序> | ε

<外部声明> → <函数定义> | <定义>

<函数定义> → <函数声明> <函数体>

<函数声明> → <函数返回类型> <函数头>

<函数返回类型> → <返回类型> | <返回类型> <指针>

<函数头> → (<参数>) | ( )

<函数体> → { <声明语句> <可执行语句部分> }

<返回类型> → void | int | char | float | double

<指针> → * | * <指针>

<参数> → <标识符类型> <标识符> | <标识符类型> <标识符> , <参数>

<标识符类型> → int | char | double | float | <标志符类型> <指针>

<标识符(变量)> → <字母> | _ | <标识符> <数字> | <标识符> <字母>

<标识符(变量)> → <字母> | _ | <标识符(变量)>`

<标识符(变量)>` → <数字> | <字母>

<字母> → a | b | c |……| x | y | z

<数字> → 0 | 1|……| 8 | 9

<声明语句> → <标识符类型> <标识符> ; | <标识符类型> <标识符> ; <声明语句>

<可执行语句部分> → <语句> | <可执行语句部分> <语句>

<语句> → <表达式语句> | <条件语句> | <循环语句> | <跳转语句>

<循环语句> → <while (表达式语句){ 可执行语句部分}> | <for (表达式; 表达式; 表达式)  {可执行语句部分}> | do{可执行语句部分}while(表达式语句);

<条件语句> → < if语句> | <if-else语句> | <switch语句>

< if语句> → <if (表达式语句) {可执行语句部分}>

<if-else语句> → <if (表达式语句) {可执行语句部分} else {可执行语句部分}>

<switch语句> → <switch(变量){ switch语句块 }>

<switch语句块> → < case 常量: 可执行语句部分> | < default: 可执行语句部分> | < case 常量: 可执行语句部分> <switch语句块>

<常量> → <数字> | <去0数字> <常量>

<去0数字> → 1 | 2 | 3 |……| 8 | 9

<跳转语句> → continue ; | break ; | return ; | return 表达式; |return

<表达式语句> → <赋值表达式> | <逻辑表达式> | <算术表达式 E>

<赋值表达式> → <变量> = <算术表达式>

<逻辑表达式> → (<表达式> | <数字> ) <逻辑运算符> (<表达式> | <数字>)

E → T|TE `

E` → (+T|-T)E`|ε

T  → F|FT `

T `→( *F| /F)T`|ε

F → PF`

F` → (↑ P | ε)F`

P (E) | <常量> | <标识符>

<逻辑运算符> → > | < | != | <= | >= | = = | ? | : | ! | || | &&

时间: 2024-10-05 23:26:56

文法改进(消除左递归)的相关文章

【转】消除左递归

转自:http://guanjy0129.blog.163.com/blog/static/111549445201061491810507/ 一个文法含有下列形式的产生式之一时: 1)A→Aβ,A∈VN,β∈V* 2)A→Bβ,B→Aα,A.B∈VN,α.β∈V* 则称该文法是左递归的. 然而,一个文法是左递归时,不能采取自顶向下分析法. 消除左递归方法有: a)把直接左递归改写为右递归: 设有文法产生式:A→Aβ|γ.其中β非空,γ不以A打头. 可写为:A→γA' A'→βA'|ε 一般情况

二义性 消除左递归

书是龙书 编译器中常用的方法可以分为自顶向下和自底向上的.一个是从语法分析树的顶部开始向底部构造语法分析树,一个则是从叶子节点开始,逐渐向根结点构造,这两种分析方法中,语法分析器的输入总是照着从左向右. 二义性:如果一个文法可以为某个句子生成多棵语法分析树,那么他就是二义性的. 例如例子id + id * id 消除左递归 如果一个文法中有一个非终结符号A使得对某个串a 存在一个推导A=>Aa 那么这个文法就是左递归 消除办法: A-> Aa1| Aa2|......Aam|β1|β2|βn

如何消除左递归

首先,什么叫做左递归呢? 一个左递归的语法通常有这样的形式 :  A-> Aa .而自顶向下的语法分析是无法处理左递归语法的.为什么呢?无论是递归分析还是预测分析或者是LL文法分析,在碰到左递归这种语法时都会陷入死循环当中.如果我们用递归分析,那么在分析A这个非终结符号的时候就会调用functionA,functionA将A分解成A,a,然后在我们再次碰到A的时候又会调用functionA,这样便形成了无限递归.如果我们用非递归的LL文法分析,那么在我们将把A->Aa无限次地压入到栈中,即每次

第十次——消除左递归

1.将以下文法消除左递归,求FIRST集.FOLLOW集,SELECT集,并分析符号串 i*i+i        E -> E+T | T      T -> T*F | F      F -> (E) | i 消除左递归: E→TE' E'→+TE'|ε T→FT' T'→*FT'|ε F→(E)|i FIRST集: FIRST(TE')={T} FIRST(+TE')={+} FIRST(ε)={ε} FIRST(FT')={F} FIRST(*FT')={*} FIRST((E))

10 消除左递归

1.将以下文法消除左递归,并分析符号串 i*i+i   (1)E -> E+T | T E -> TE' E' -> +TE'|ε (2)T -> T*F | F T -> FT' T' -> *F|ε (3)F -> (E) | i 2.P101练习7(2)(3)文法改写,并分别求FIRST集.FOLLOW集,和SELECT集 (2) A -> aABe|a B -> Bb|d First(A)={a,e} First(B)={b,d}  (3) S

编译原理:消除左递归

1.将以下文法消除左递归,分析符号串 i*i+i . 并分别求FIRST集.FOLLOW集,和SELECT集 E -> E+T | T T -> T*F | F F -> (E) | i 2.P101练习7(2)(3)文法改写,并分别求FIRST集.FOLLOW集,和SELECT集 课堂练习: 求以下文法的FIRST集.FOLLOW集和SELECT集. S->ApA->a |εA->cA A->aA S->ApS->BqA->aA->cAB

11.13消除左递归

1.将以下文法消除左递归,分析符号串 i*i+i . 并分别求FIRST集.FOLLOW集,和SELECT集 E -> E+T | T T -> T*F | F F -> (E) | i 答: 消除左递归: E -> TE’ E’ -> +TE’ | ε T -> FT’ T’ -> *FT’ | ε F -> (E) | i 分析符号串 i*i+i : FIRST集: FIRST(E) = { ( , i } FIRST(E’) = {+ , ε } FI

编译原理10 消除左递归

1.将以下文法消除左递归,分析符号串 i*i+i . 并分别求FIRST集.FOLLOW集,和SELECT集 E -> E+T | T T -> T*F | F F -> (E) | i 消除左递归得: E->TE’ E’->+TE’|ε T->FT’ T’->*FT’|ε F->(E)|i 分析字符串如下: FIRST集: FIRST(TE’)={ (, i } FIRST(+TE')={+,ε} FIRST(FT’)={(,i} FIRST(*FT')=

消除左递归

1.将以下文法消除左递归,分析符号串 i*i+i . 并分别求FIRST集.FOLLOW集,和SELECT集 E -> E+T | T T -> T*F | F F -> (E) | i 解: 消除左递归:         E  ->TE`         E` ->+TE`|ε         T  ->FT `         T `->*FT `|ε         F  ->i|(E) FIRST集: FIRST(TE`)={T} FIRST(+TE