什么是文法产生式(尽量写简单了)

编译器中的语法定义

1 术语

  • 上下文无关文法

一种广泛使用的方法来描述语法。比如C语言,C++,Java等都转成这种表达方法来描述。

上下文无关文法不仅可以描述一个语言的语法,还可以指导程序的翻译过程

  • 后缀表达式

将运算符放在运算分量之后。比如9+5-2的后缀表达式为95+2-。首先记住这个简单的结论,先不要考虑95是9和5还是95。

  • 词法单元(token)

词法分析器使得翻译器可以处理多个字符处理的构造。比如标识符,标识符由多个字符组成,但是在语法分析阶段被当作一个单元进行处理。例如

count + 1

标识符被当作一个单元。

词法分析器允许表达式中出现数值标识符空白字符

2 语法定义

一个典型的if-else语句可由下述构造规则表达

stmt -> if(expr) stmt else stmt

其中

变量名全称
stmtstatement
exprexpression

比如

if(i==0){
	return 1;
}
else{
	return 2;
}

涉及术语

  • 产生式(production)
stmt -> if(expr) stmt else stmt
  • 终结符号(terminal)
if, (), {}
  • 非终结符号(nonterminal)
expr, stmt

3 文法定义

3.1 上下文无关文法

上下文无关文法(context-free grammar)由四部分构成

  1. 终结符号集合:也被称为”词法单元“

  2. 非终结符号集合:也称为”语法变量“

  3. 产生式集合

    假设产生式为

    stmt1 -> if(expr) stmt2 else stmt3
    

    产生式集合包括

    • 产生式头左部: stmt1
    • 箭头: ->,读作”可以具有以下形式“
    • 产生式体右部: if(expr) stmt2 else stmt3
  4. 指定一个非终结符号为开始符号

3.2 词法单元和终结符号

在语法分析中,词法单元就是终结符号

词法单元由2部分组成:名字属性。词法单元是语法分析器进行语法分析时使用的抽象符号。

在编译器中有一个符号表专门保存词法单元的附加信息。可以通过引用指向符号表的指针来访问词法单元。

3.3 产生式举例

产生式规则:

非终结符作为头部,如果多个产生式的头部一样,则可以合并,用|进行分割

比如9-5+23-17

list -> list + digit
list -> list - digit
list -> digit

digit -> 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0

通过替换可知
list -> list + digit 可替换为 list -> digit + digit,而digit+digitdigit,可推出list -> digit,所以list->list+digitlist->digit的头部是一致的
因此可得出下面的文法产生式

list -> list + digit | list - digit | digit

该文法的终结符号为

+ - 0 1 2 3 4 5 6 7 8 9
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值