BISON语法分析工具_第1页
BISON语法分析工具_第2页
BISON语法分析工具_第3页
BISON语法分析工具_第4页
BISON语法分析工具_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、自动语法分析工具Bison(2015-01-30 12:42:55)转载标签:杂谈BISON用于语法分析器的自动生成,它可以很方便地生成一个所谓的抽象语法树,树的每一个子树都代表了一个特定的语法成分,便于后期处理。这个工具可以在网上下载获得。化点时间学习这个工具的用法,并用于SQL语言的分析,可以让我们把精力专注在语法规则上,而不是具体的分析函数编写上。对整个DBMS来说,使用自动化工具进行语言处理程序的自动生成,使得语言分析模块成为最可靠最方便维护的模块之一。BISON源文件的结构我们需要按照BISON的要求,书写BISON的源程序(gramma.y)。遵循它的规则是必须的,BISON会把它

2、的源文件翻译为C文件。因此,BISON是编译程序的翻译器。BISON的源文件通常由八个部分组成:一自由定义部分:%这部分被BISON原封不动地复制到输出的.C文件中。通常用于定义一些在规则程序中需要使用的一些常量,函数原形等。二语法栈的联合(UNION)结构语法分析程序使用一个堆栈来存放规约到的各个语法成分,堆栈用一个数组表示,这个数组的每个元素需要能够描述每一个语法成分,所以采用一个UNION:%unionUnion中的每一个项,都是一个语法规则的每一个非终结符;以整数四则表达式为例:exp : exp exp| exp - exp| exp * exp| exp / exp| ( exp

3、)| lt_integer;lt_integer: LT_INTEGER;这里有两个语法规则,对应了两个非终结符号: exp是表达式,lt_integer表示整数常量(LT_INTEGER表示词法分析程序返回的一个确认为整数的单词)。对应的,这个union可以书写为:%par_exp_t*exp;intlt_integer;其中par_exp_t用来描述被识别出的exp的信息,int存放被识别出的整数的值。上面的例子很简单,所以union只有两个字段;在DM6的语法分析程序中,这个UNION大约有490个字段,也就是,大概有490个语法规则产生式。当然你也可以不采用这个UNION,那么每一个规

4、约出来的语法成分都是一个C指针,需要上层做类型转换来解释。三非终结符的类型声明上面定义了分析栈的UNION类型,还需要把字段名与语法非终结符号对应起来:%type 非终结符号如上例,这部分应该写为:%type exp%type lt_integer看上去似乎有点多余,每一行都是一个简单的重复。但前面一个表示的是UNION中对应的字段名,后一个是语法符号;如果我们把UNION改为:%par_exp_t*eeee;intiiii;那么对应的类型声明需要改为:%type exp%type lt_integer;这种不一致的写法,事实上会造成混乱,所以应该采用上面一致的写法。四:单词(token)声明

5、语法分析的输入是连续的有确定意义的单词。下面需要声明分析程序支持的单词:%token LT_INTEGER对于SQL语法,关键字如:SELECT, FROM, WHERE等,都可以定义为单词:%token KW_SELECT, KW_FROM%token KW_WHERE五.确定运算符的优先级%left - %left * /%left ( )%left表示是左结合的,表示先规约左边的产生式,反应到表达式计算中:1 2 3别识别为:(1 2)3),而不是(1 (2 3)优先级低的符号列在前面,高有限级的符号列在后面;同一行的表示优先级相同。所以上面的书写方式,符合“先乘除,后加减,括号最优先”

6、的原则。除了%left以后,还有%right, %nonassoc等用来只是右结合,或者不结合等说明符号,可查看bison的详细说明。六.声明语法的开始符号%start exp这是告知bison,这是语法最终需要规约的非终结符号。七.语法规则定义这是语法分析程序的核心定义部分,用%开始,前面已经列出了关于表达式的语法规则:%exp : exp exp| exp - exp| exp * exp| exp / exp| ( exp )| lt_integerlt_integer: LT_INTEGER;八自由添加的C源代码在语法规则定义部分的后面,可以用%开始,定义C的辅助代码。这部分代码将被原

7、封不动地复制到输出的.C文件中。给语法规则配上规约动作规约动作是一段C代码,它的作用是每当分析器识别出一个语法符号时,调用该代码,完成一定的动作。通常,我们使用这段代码,来建立当前语法节点与子节点勾连动作。规约动作应该紧接在语法规则的后面。如上例:exp : exp exp$ = new_node(PAR_EXP, 1);$-tag = 1;$-exp1 = $1;$-exp2 = $3;g_root = $;| ( exp )$ = $2;这里仅列出了其中的两个子规则,其中A, B, C, D四个语句构成了第一个子规则的语句块:A;为识别出的exp生成一个结构,用$指向它。$是一个bison

8、定义的特殊标记,其意义是当前语法栈的规约元素。如果没有规约动作代码,缺省情况下赋予$为NULL。new_node是一个需要自己编写的函数,用于生成各个子节点,PAR_EXP是一个事先定义的常量。显然,对于不同的规则,需要定义不同的常量类型。象new_node这样的函数,一般放在.y文件的最后一个部分。B:用来区分是哪个子规则规约的,这里用tag= 1来表示两个子表达式运算C.保留第一个子表达式;$1表示这个产生式的第1个语法成分所在的语法栈中对应的值D.保留第二个子表达式;$3表示这个产生式的第3个语法成分所在的语法栈中对应的值;注意这里的也占一个位置,用$2,这里因为有tag=1,已经把相应的信息保存到$中,所以不需要管它。E:这是一个比较特别的语句,它把$赋给了一个全局量。因为exp是个开始符号,当分析结束时,这个g_root就是语法树的根。F:因为加了括号的表达式与原表达式等价,所以直接把$2赋给$就可以了,不需要再生成par_exp节点。最终的函数yyparse()yyarse()是bison生成的分析器的主函数。调用yyarse(),如果一切顺利

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论