分享
分销 收藏 举报 申诉 / 8
播放页_导航下方通栏广告

类型BISON语法分析工具.doc

  • 上传人:天****
  • 文档编号:4360944
  • 上传时间:2024-09-13
  • 格式:DOC
  • 页数:8
  • 大小:24.50KB
  • 下载积分:6 金币
  • 播放页_非在线预览资源立即下载上方广告
    配套讲稿:

    如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。

    特殊限制:

    部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。

    关 键  词:
    BISON 语法分析 工具
    资源描述:
    ​自动语法分析工具Bison  (20150130 12:42:55) 转载▼ 标签:  杂谈     BISON用于语法分析器得自动生成,它可以很方便地生成一个所谓得抽象语法树, 树得每一个子树都代表了一个特定得语法成分,便于后期处理。这个工具可以在网上下载获得。化点时间学习这个工具得用法,并用于SQL语言得分析,可以让我们把精力专注在语法规则上,而不就是具体得分析函数编写上。对整个DBMS来说,使用自动化工具进行语言处理程序得自动生成,使得语言分析模块成为最可靠最方便维护得模块之一。 BISON源文件得结构      我们需要按照BISON得要求,书写BISON得源程序(gramma、y)。遵循它得规则就是必须得,BISON会把它得源文件翻译为C文件。因此,BISON就是编译程序得翻译器。BISON得源文件通常由八个部分组成: 一.    自由定义部分: %{ %} 这部分被BISON原封不动地复制到输出得、C文件中。通常用于定义一些在规则程序中需要使用得一些常量,函数原形等。  二.语法栈得联合(UNION)结构 语法分析程序使用一个堆栈来存放规约到得各个语法成分,堆栈用一个数组表示,这个数组得每个元素需要能够描述每一个语法成分,所以采用一个UNION: %union { }  Union中得每一个项,都就是一个语法规则得每一个非终结符;以整数四则表达式为例: exp : exp ‘ ’ exp     | exp ‘‘ exp     | exp ‘*’ exp     | exp ‘/’ exp     | ‘(‘ exp ‘)’     | lt_integer ; lt_integer: LT_INTEGER; 这里有两个语法规则,对应了两个非终结符号: exp 就是表达式, lt_integer表示整数常量(LT_INTEGER表示词法分析程序返回得一个确认为整数得单词)。对应得,这个union可以书写为:  %{  par_exp_t*      exp;  int             lt_integer; };  其中par_exp_t用来描述被识别出得exp得信息,int存放被识别出得整数得值。上面得例子很简单,所以union只有两个字段;在DM6得语法分析程序中,这个UNION大约有490个字段,也就就是,大概有490个语法规则产生式。当然您也可以不采用这个UNION, 那么每一个规约出来得语法成分都就是一个C指针, 需要上层做类型转换来解释。  三.非终结符得类型声明 上面定义了分析栈得UNION类型, 还需要把字段名与语法非终结符号对应起来: %type <字段名>  非终结符号  如上例,这部分应该写为: %type <exp> exp %type <lt_integer> lt_integer  瞧上去似乎有点多余,每一行都就是一个简单得重复。但前面一个表示得就是UNION中对应得字段名,后一个就是语法符号;如果我们把UNION改为:  %{ par_exp_t* eeee; int         iiii; };  那么对应得类型声明需要改为: %type <eeee> exp %type <iiii> lt_integer;  这种不一致得写法,事实上会造成混乱,所以应该采用上面一致得写法。  四:单词(token)声明 语法分析得输入就是连续得有确定意义得单词。下面需要声明分析程序支持得单词: %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))  优先级低得符号列在前面,高有限级得符号列在后面;同一行得表示优先级相同。所以上面得书写方式, 符合“先乘除,后加减,括号最优先”得原则。  除了%left以后,还有%right, %nonassoc等用来只就是右结合,或者不结合等说明符号,可查瞧bison得详细说明。  六、声明语法得开始符号 %start exp 这就是告知bison, 这就是语法最终需要规约得非终结符号。   七、语法规则定义 这就是语法分析程序得核心定义部分,用%%开始, 前面已经列出了关于表达式得语法规则: %% exp : exp ‘ ’ exp     | exp ‘‘ exp     | exp ‘*’ exp     | exp ‘/’ exp     | ‘(‘ exp ‘)’     | lt_integer  lt_integer: LT_INTEGER;   八.自由添加得C源代码  在语法规则定义部分得后面,可以用%%开始,定义C得辅助代码。这部分代码将被原封不动地复制到输出得、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定义得特殊标记,其意义就是当前语法栈得规约元素。如果没有规约动作代码,缺省情况下赋予$$为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,如果一切顺利,那么上例中得g_root将指向一个完成得语法树。  如果输入得字符串有语法错误,则分析器将停止分析,在退出yyparse函数前,会调用一个yyerror(char*s)得函数,这个函数需要用户自己定义,以便能捕获一些用意义得信息,比如:语法错误出现得行号,附近得单词等。
    展开阅读全文
    提示  咨信网温馨提示:
    1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
    2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
    3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
    4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
    5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
    6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。

    开通VIP折扣优惠下载文档

    自信AI创作助手
    关于本文
    本文标题:BISON语法分析工具.doc
    链接地址:https://www.zixin.com.cn/doc/4360944.html
    页脚通栏广告

    Copyright ©2010-2026   All Rights Reserved  宁波自信网络信息技术有限公司 版权所有   |  客服电话:0574-28810668    微信客服:咨信网客服    投诉电话:18658249818   

    违法和不良信息举报邮箱:help@zixin.com.cn    文档合作和网站合作邮箱:fuwu@zixin.com.cn    意见反馈和侵权处理邮箱:1219186828@qq.com   | 证照中心

    12321jubao.png12321网络举报中心 电话:010-12321  jubao.png中国互联网举报中心 电话:12377   gongan.png浙公网安备33021202000488号  icp.png浙ICP备2021020529号-1 浙B2-20240490   


    关注我们 :微信公众号  抖音  微博  LOFTER               

    自信网络  |  ZixinNetwork