软件设计师(一)编译原理-文法

编译原理

  • 考点1:文法
  • 考点2:正规式
  • 考点3:有穷自动机
  • 考点4:语法推导树
  • 考点5:算符优先

表格,看完整篇在看这个表格,更好的记忆

类型别称对应机器规则(简记)
0型文法短语文法图灵机必须属于Vn,Vt,α至少一个大写(非终止符)
1型文法上下文有关文法线性有界自动机|β|>=|α|
2型文法上下文无关文法下推自动机左边只能都是非终结符,左边只能是大写
3型文法正规文法有限状态自动机一个终结符|一个终结符加上一个非终结符&左线性|右线性

1.文法(α->β)

终结符不能单独在左边

1.1文法的类型

  • 0型文法
  • 1型文法
  • 2型文法
  • 3型文法

Vn 非终结符,一般为大写字母:S、A、D

Vt 终结符,一般为小写字母:a、b、d

1.2 0型文法(短语文法)

设G=(Vn,Vt,P,S),α->β,如果α∈(Vn∪Vt),并且至少含有一个非终结符,而β∈(Vn∪Vt),则G是一个0型文法。

简单来说:α->β,这个式子的左右两边,都必须属于Vn,Vt,可以单独,也可以任意组合,而且左边至少有一个大写:

Aa->b A->aba

0型文法也称为短语文法,能力相当于图灵机,任何0型文法都是递归可枚举的,反之,递归可枚举集必定是一个0型文法

1.3 1型文法(上下文有关文法)

对应与线性有界自动机

在0型文法的基础上,每一个α->β,都有**|β|>=|α|**。这里的|β|表示为长度

但有一特例:α→ε也满足1型文法

1.4 2型文法(上下文无关文法)

2型文法也叫上下文无关文法,对应下推自动机

2型文法是在1型文法的基础上再满足,每一个α->β都有α是非终结符。

如:

​ A->Ba,符合2型文法要求

​ Ab->Bab虽然符合1型文法要求,但是不符合2型文法要求,因为α=Ab,α含有一个b(终止符)

简单的说就是规则左边只能都是非终结符

1.5 3型文法(正规文法)

3型文法对应于正规文法,对应于有限状态自动机

在2型文法的基础上满足:A->α|αB(右线性)或A->α|Bα(左线性)

规则:

  1. 首先他要是2型文法

  2. 推导式的右边必须是一个终结符或者是一个终结符加上一个非终结符

  3. 在一串推导式中,只能有一套规则,就是说,只能全部都是左线性,或者是全部都是右线性

解释:

A->a,A->aB,B->a,B->cB   这个例子是正确的,他符合上面的三条

A->ab,A->aB,B->a,B->cB  这个例子中A->ab不符合上面的第2条,所以不是3型文法

A->a,A->Ba,B->a,B->cB   A->Ba,是左线性的,但是B->cB是右线性的,违反第3条所以,也不是3型文法

1.6 如何判断一个串是否为某个文法的句型

两种方法:构造推导树和直接进行推导

例题:

已知文法G[S]:S→A0|Bl,A→S1|1,B→S0|0;该文法属于乔姆斯基定义的__(12)文法,它不能产生串(13)__。

解答:

第一步,首先列出G的所有推导式:

S->A0;

S->B1;

A->S1;

A->1;

B->S0;

B->0;

第二步,根据上面所有的推导式,分析:

  • 0型文法,左边必定至少有一个大写(非终止符) 正确
  • 1型文法,|β|>=|α|,正确
  • 2型文法,左边只有大写(非终止符) 正确
  • 3型文法,单线性,符合A->α|Bα(左线性)规则,且只有一套规则,正确

所以为3型文法,正规文法

第三步,通过第一步的推导式推导得出串:

S->A0->S10->A010->1010 即B
S->B1->S01->A001->1001 即C
S->B1->S01->B101->0101 即D

所以A 0011推导不出来,所以选A

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言的文法可以用BNF(巴克斯-诺尔范式)表示,如下: ``` <program> ::= <declaration-list> <declaration-list> ::= <declaration> | <declaration-list> <declaration> <declaration> ::= <var-declaration> | <fun-declaration> <var-declaration> ::= <type-specifier> <id-list> ; <type-specifier> ::= int | float | char <id-list> ::= <id> | <id-list> , <id> <id> ::= <identifier> | <identifier> = <expression> <fun-declaration> ::= <type-specifier> <identifier> ( <params> ) <compound-stmt> <params> ::= <param-list> | void <param-list> ::= <param> | <param-list> , <param> <param> ::= <type-specifier> <identifier> <compound-stmt> ::= { <local-declarations> <statement-list> } <local-declarations> ::= <var-declaration> | <local-declarations> <var-declaration> <statement-list> ::= <statement> | <statement-list> <statement> <statement> ::= <expression-stmt> | <compound-stmt> | <selection-stmt> | <iteration-stmt> | <return-stmt> <expression-stmt> ::= <expression> ; | ; <selection-stmt> ::= if ( <expression> ) <statement> | if ( <expression> ) <statement> else <statement> <iteration-stmt> ::= while ( <expression> ) <statement> <return-stmt> ::= return ; | return <expression> <expression> ::= <var> = <expression> | <simple-expression> <var> ::= <identifier> | <identifier> [ <expression> ] <simple-expression> ::= <additive-expression> <relop> <additive-expression> | <additive-expression> <additive-expression> ::= <term> | <additive-expression> + <term> | <additive-expression> - <term> <term> ::= <factor> | <term> * <factor> | <term> / <factor> <factor> ::= ( <expression> ) | <var> | <call> | <number> <call> ::= <identifier> ( <args> ) <args> ::= <arg-list> | void <arg-list> ::= <expression> | <arg-list> , <expression> <relop> ::= <= | < | >= | > | == | != ``` 其中,`<program>`是C语言程序的起始符号,整个程序由一个或多个声明组成;`<declaration>`可以是变量声明或函数声明;`<var-declaration>`定义变量的类型和标识符;`<fun-declaration>`定义函数的返回类型、函数名、参数类型和参数名;`<compound-stmt>`包含局部变量声明和语句列表;`<statement>`包括表达式语句、复合语句、选择语句、循环语句和返回语句;`<expression>`是算术或关系表达式;`<var>`表示变量或数组元素;`<call>`表示函数调用;`<args>`表示函数参数;`<relop>`表示关系运算符。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值