正在加载图片...
至于为什么要使用状态,我们来看一个实际的例子:上面分析头文件的 时候采用了两个自定义的状态:InCLUDE状态和INCLUDE FILE状态 NCLUDE状态是当遇到了#include开始的,因为这个状态之后是尖括号 或者是双引号括起来的头文件名,在后面分析模板(使用尖括号)和分 析字符串(使用双引号)的时候也会遇到尖括号和双引号,因而需要区 分这两种情况,所以才需要使用INCLUDE状态,以此来区分是包含文件 还是模板成若是字符串了。这一点非常重要! 同样,状态_INCLUDE_FILE存在也是为了区分双引号包含的头文件名称 的,因为双引 号不】 尖括号,双引号 在头文件名的开始和结 束都是村 同的,因此为了区分头部和尾部的双引号,必须再增加一个状态。实际 上这可以用来简化词法分析器的编写,当您遇到这种类似的问题的时候 可以考虑再增加一种新的状态,通常来说就可以解决问题啦:) 不时坏右一占特别云要漏周的是当你成微所添加的状态太多了,出现了混 乱现象,就说明用Lx状态已经不大适合处理这种问题 ,就应该考虑 采用Yacc的一条独立的语法规则来进行处理了:)这也是Yacc语法文件 存在的原因,要不然全部都可以采用词法分析文件来解决啦,还要语法 分析文件干什么! 递归表达 这里需要特别注意的是:frame..y文件中p 的形式。从代码中可以看出 orogram可以是 是由现有的program内容再追加一条include_preprocess类构成。当 program内容为空的时候增加一条include_preprocess类就表示 program只有一条include_preprocess内容,当program己经有了一条 includepreprocess内容之后再增加一条include preprocess内容就 可以表示两条in 了,依次类推, 可以表达无数的 包含信息,从而表达了无限的内容了。特别需要注意的是,这里的 program表示的仅仅是现有的内容,包括但不限于include_preprocess 内容,还可以有其他的内容,这一点可以在增加其他内容的时候体现出 来,因为C/C+源代码不仅仅是由包含信息构成的嘛:) 特别需要注意的是,这甲要特表强调一下使用左递归,不是说右弟归不行 而 是出于程序运行效率考虑最好使用左递归。具体原因在后续的文档中 会有详细的说明的:) YYSTYPE,yylval,$$$1,$2,...$n 因为编写词法分析程序和语法分析程序的目的就是为了操作分析出来的 数据,所以就需要有一种比较方便的形式来表达这些分析出来的数据。 一种是词法分析程序使用的方式,叫做yylval: 一种是语法分析程序付 用的, 川做n 法分析程序和语法分析程序中已经可以看到 它们在相应的文件中的使用了至 于为什么要使用状态,我们来看一个实际的例子:上面分析头文件的 时候 采用了两个自定义的状态:_INCLUDE_状态和_INCLUDE_FILE_状态, _INCLUDE_状态是当遇到了#include 开始的,因为这个状态之后是尖括号 或者 是双引号括起来的头文件名,在后面分析模板(使用尖括号)和分 析字符串 (使用双引号)的时候也会遇到尖括号和双引号,因而需要区 分这两种情况 ,所以才需要使用_INCLUDE_状态,以此来区分是包含文件 还是模板或者是字 符串了。这一点非常重要! 同样,状态 _INCLUDE_FILE_存在也是为了区分双引号包含的头文件名称 的, 因为双引号不同于尖括号,双引号在头文件名的开始和结束都是相 同的,因 此为了区分头部和尾部的双引号,必须再增加一个状态。实际 上这可以用来 简化词法分析器的编写,当您遇到这种类似的问题的时候 可以考虑再增加一 种新的状态,通常来说就可以解决问题啦:) 不过还有一点特别需要强调的是当您感觉所添加的状态太多了,出现了混 乱 现象,就说明用 Lex 状态已经不大适合处理这种问题了,就应该考虑 采用 Yacc 的一条独立的语法规则来进行处理了:)这也是 Yacc 语法文件 存在的原因,要 不然全部都可以采用词法分析文件来解决啦,还要语法 分析文件干什么! 递归表达 这 里需要特别注意的是:frame.y 文件中 program 的构成采用了左递归 的形 式。从代码中可以看出:program 可以是空(什么也没有)也可以 是由现有 的 program 内容再追加一条 include_preprocess 类构成。当 program 内容为 空的时候增加一条 include_preprocess 类就表示 program 只有一条 include_preprocess 内容,当 program 已经有了一条 include_preprocess 内 容之后再增加一条 include_preprocess 内容就 可以表示两条 include_preprocess 内容了,依次类推,可以表达无数的 包含信息,从而 表达了无限的内容了。特别需要注意的是,这里的 program 表示的仅仅是现 有的内容,包括但不限于 include_preprocess 内容,还可以有其他的内容 ,这一点可以在增加其他内容的时候体现出 来,因为 C/C++源代码不仅仅是 由包含信息构成的嘛:) 特别需要注意的是,这里要特表强调一下使用左递归,不是说右递归不行, 而 是出于程序运行效率考虑最好使用左递归。具体原因在后续的文档中 会有详细 的说明的:) YYSTYPE, yylval, $$,$1,$2,...$n 因 为编写词法分析程序和语法分析程序的目的就是为了操作分析出来的 数据 ,所以就需要有一种比较方便的形式来表达这些分析出来的数据。 一种是词 法分析程序使用的方式,叫做 yylval;一种是语法分析程序使 用的,叫做$n ,从上面的词法分析程序和语法分析程序中已经可以看到 它们在相应的文件 中的使用了
<<向上翻页向下翻页>>
©2008-现在 cucdc.com 高等教育资讯网 版权所有