Bison Manual基础笔记1

参考和推荐阅读:

http://blog.csdn.net/sirouni2003/article/details/590661

http://www.cppblog.com/woaidongmao/archive/2008/09/20/62322.html

 

上面的文章都不错,第一个是Bison手册的翻译,所以就不重复了,阅读翻译就能很快的了解bison的使用了。

了解了Lex之后,那么yacc/bison就相对容易理解了,基本的思路等都是差不多的,需要一个输入文件,经过bison命令产生输出的C文件,为一个语法解析器parser,然后用gcc编译就得到可执行文件,整体思路和lex的使用过程一样。但是Bison相对于Lex困难一点,就在于涉及的概念更多。

1. 基本概念

上下文无关文法:Bison使用上下文无关文法进行描述。

参考:

http://baike.baidu.com/view/110877.htm

http://zh.wikipedia.org/wiki/%E4%B8%8A%E4%B8%8B%E6%96%87%E6%97%A0%E5%85%B3%E6%96%87%E6%B3%95

几乎所有的程序语言都是使用上下文无关文法描述的。

通常用BNF范式表达上下文无关文法,Bison的输入就要求必须是BNF范式。

上下文无关文法有很多子集,Bison几乎都支持,但是主要对LALR(1)文法进行了优化。

LALR(1)文法分析器具有确定性(deterministic), 这就意味着匹配于输入的下一个文法规则取决于之前的输入和确定的部分剩余输入(我们称之为一个超前扫描记号(look-ahead). 一个上下文无关文法可能是有歧义的(ambiguous),即可能可能有多种规则来匹配某些输入. 即使非歧义性文法也可能使不确定(non-deterministic)的, 即没有总能足以决定下一个应用的文法规则的固定的超前扫描记号。

在正式的语言语法规则中,每一种语法单元或组合被称之为符号(symbol). 那些可以通过语法规则被分解成更小的结构的符号叫做非终结符(nonterminal symbols). 那些不能被再分的符号叫做终结符(terminal symbols)或者记号类型(token types). 我们把同终结符相对应的输入片段叫做记号(token), 把同单个非终结符相对应的输入片段叫做组(grouping).

C语言的语法组包括表达式,语句,声明和函数定义。每一个非终结符必须有一个描述如何由更简单结构组成这个非终结符的语法规则。

在Bison中,终结符也被称为符号类型(token type). 

Bison的输入为正规文法,一般来说,其中的非终结符使用小写字母表示,比如expr,stmt,declaration等,其中的终结符采用大写字母表示,如INTEGER,INDITIFIER,RETURN,IF等等。

2. Bison语法文件的整体布局

Bison工具的输入文件是以个Bison语法文件(Bison grammar file). 通常的Bison语法文件格式如下:

%{ Prologue %} Bison declarations %% Grammar rules %% Epilogue

很容易看出,结构和Lex的输入文件完全一样。相信注释什么的也是一样的了。这其中,%%,%{%}的作用和Lex完全一样。

Bison declarations声明了终结符和非终结符以及操作符的优先级和各种符号语义值的各种类型.

Grammar rules定义了如何从每一个非终结符的部分构建其整体的语法规则.

Epilogue可以包括任何你想使用的代码. 

Bison语法输入文件通常以`.y'结尾

 

你可能感兴趣的:(Bison Manual基础笔记1)