Bison Manual基础笔记1

参考和推荐阅读:html

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. 基本概念.net

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

参考:code

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

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 blog

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

一般用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'结尾

相关文章
相关标签/搜索