flex和bison笔记.pdf

  1. 1、本文档共18页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
flex和bison笔记

flex和bison笔记 FLEX 什么是FLEX?它是一个自动化工具,可以按照定义好的规则自动生成一个C函数yylex(),也成为扫描 (Scanner )。这个C函数把文本 串作为输入,按照定义好的规则分析文本串中的字符,找到符合规则的一些字符序列后,就执行在规则中定义好的动作 (Action)。例如 在规则中可以这样定义:如果遇到一个换行字符\n,那么就把行计数 的值加一。 Flex文件就是一个文本文件,内容包括定义好的一系列词法规则。文件的命名习惯上以小写字母l(L)来作为文件后缀。如果为了清晰,也可 以用.flx或者.flex作为文件的后缀名。Flex文件完成后,就执行下列命令: $ flex example.flex 这个命令执行后将生成一个C文件,默认文件名为lex.yy.c。这个C文件主要内容就是函数yylex()的定义。 如果要直接将这个文件编译成为一个可执行程序,还有一些要注意的地方。如果在Flex文件中没有提供main()函数的定义,那么这个C文 件中不会有main()函数。此时单独编译这个C文件的时候,一定要加上-lfl的连接库参数;若提供了main()函数,就不必要提供这个连接库 参数了。连接库libfl提供了一个缺省的main函数。缺省的main()函数中只是简单地调用yyflex()函数,而自己提供的main()函数则可以根据 需要加入许多其他的处理代码。 Flex文文件件 词法规范定义文件给出了单词构成规则。词法文件在习惯上用字母l(即L的小写)来作为后缀。Flex文件由三个部分组成。或者说三个段。三 个段之间用两个%%分隔。 定义段(definition ) %% 规则段(rule ) %% 用户代码段(u er code) 定定义义段段(definitions section) 定义段包含着一些简单名字的定义(name definition ),旨在简化扫描 的规范。定义名字的方法如下: name definition 名字可以由字母或下划线开头,后跟零个或多个字母、数字、下划线、或短横线。名字的定义则从其后的第一个非空白字符(non-white- pace)开始直到行尾。下面是一个例子,定义了一个名字DIGIT ,其定义就是指一个数字,如下所示: DIGIT [0-9] 当在后面引用这个名字时,用一对花括号({})括住该名字即可。它会被展开成一对圆括号括住的该名字的定义,即: {name} 展开成 (definition) 例如: {DIGIT}+.{DIGIT}* 就等价于: ([0-9])+.([0-9])* 定义段中还可以加入启动条件( tart condition )的声明。顾名思义,启动条件就如同C语言中的条件编译一样,根据指定的启动条件去激活 一条规则,并用这条规则去匹配读入的字符。关于启动条件,后面还有更详细的介绍。 规规则则段段(rules section) 规则由模模式式(pattern)和动动作作(action)两个部分组成。模模式式就是一个正则表达式,FLEX加入了一些自己的扩展。而动动作作一般就是一些C语 句。模式指出了一个单词是如何构成的,当分析出一个符合该规则的单词时,就执行相应的动作。 模式一定要位于一行的开头处,不能有缩进。而动作的开头一定要与模式在同一行。当动作是用一对花括号{}括起来时,可以将左花括号 放在与规则相同的行,而其余部分则可以从下一行开始。 用用户户代代码码段段(user code) 所有用户代码都被原样拷贝到文件lex.yy.c中。在这里可以定义一些辅助函数或代码,供扫描 yylex()调用,或者调用扫描 (一般来说就 是main()了)。这一部分是可有可无的。如果没有的话,Flex文件中第二个%%是可以省略的。 在定义段或者规则段中,任何一行有缩缩进进的的文文本本或者包含在在一一对对%{和和%}之之间间的的文文本本,都被原样拷贝到最后生成的C代码文件中 (当然% {和%}会被移走)。在书写时%{和%}都必须在一行的开始处,不能缩进。 在规则段中,第一条规则之前的任何未缩进的文本或者在%{和%}之间的文本,可以用来为扫描 声明一些本地变量和代码。一旦进入扫 描 的代码,这些代码就会被执行。规则段内其他的缩进的文本或者%{和%}之间的文本还是被原样拷贝输出,但是他们的含义是尚未有 明确定义,很可能引起编译时 (compile-time )错误 (这一特性是为了与POSIX兼容而提供的)。 在定义段中,没有缩进的注释也会被原样拷贝到最后生成的C代码文件

文档评论(0)

yaocen + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档