热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

第二人生的源码分析(106)脚本的词法分析(4)

前面介绍了flex文件的格式,那么flex程序又把这个文件生成怎么样的文件呢?下面就来仔细分析这个文件,由于flex程序生成C++的文件格式,那么就需要C++的编译器才可以编译了。它的代码
 

前面介绍了flex文件的格式,那么flex程序又把这个文件生成怎么样的文件呢?下面就来仔细分析这个文件,由于flex程序生成C++的文件格式,那么就需要C++的编译器才可以编译了。它的代码如下:

#001  #line 2 "lex_yy.cpp"

这行是行号同步使用。

 

#002  /* A lexical scanner generated by flex */

#003 

#004  /* Scanner skeleton version:

#005   * $Header: /home/daffy/u0/vern/flex/RCS/flex.skl,v 2.91 96/09/10 16:58:48 vern Exp $

#006   */

上面这段说明这个文件是由词法分析程序flex生成的。

 

#007 

#008  #define FLEX_SCANNER

#009  #define YY_FLEX_MAJOR_VERSION 2

#010  #define YY_FLEX_MINOR_VERSION 5

 

上面这段说明flex的版本号。

 

#011 

#012  #include

#013  #include

#014 

#015  /* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */

#016  #ifdef c_plusplus

#017  #ifndef __cplusplus

#018  #define __cplusplus

#019  #endif

#020  #endif

#021 

#022 

#023  #ifdef __cplusplus

#024 

#025  #include

#026  #ifndef _WIN32

#027  #include

#028  #endif

上面这段不同的flex程序和平台生成不一样,一定要小心了。

 

#029 

#030  /* Use prototypes in function declarations. */

#031  #define YY_USE_PROTOS

#032 

#033  /* The "const" storage-class-modifier is valid. */

#034  #define YY_USE_CONST

#035 

#036  #else  /* ! __cplusplus */

#037 

#038  #if __STDC__

#039 

#040  #define YY_USE_PROTOS

#041  #define YY_USE_CONST

#042 

#043  #endif /* __STDC__ */

#044  #endif /* ! __cplusplus */

#045 

 

 

 

下面再来分析下一段代码:

#001  #ifndef YY_DECL

#002  #define YY_DECL int yylex YY_PROTO(( void ))

#003  #endif

上面这行定义词法分析的函数。

 

#004 

#005  /* Code executed at the beginning of each rule, after yytext and yyleng

#006   * have been set up.

#007   */

#008  #ifndef YY_USER_ACTION

#009  #define YY_USER_ACTION

#010  #endif

#011 

#012  /* Code executed at the end of each rule. */

#013  #ifndef YY_BREAK

#014  #define YY_BREAK break;

#015  #endif

#016 

#017  #define YY_RULE_SETUP /

#018     YY_USER_ACTION

#019 

 

下面开始定义词法分析。

#020  YY_DECL

#021     {

#022     register yy_state_type yy_current_state;

#023     register char *yy_cp, *yy_bp;

#024     register int yy_act;

#025 

#026  #line 62 "indra.l"

#027 

#028  #line 2582 "lex_yy.cpp"

#029 

 

判断是否初始化。

#030     if ( yy_init )

#031         {

#032         yy_init = 0;

#033 

#034  #ifdef YY_USER_INIT

#035         YY_USER_INIT;

#036  #endif

#037 

#038         if ( ! yy_start )

#039             yy_start = 1;   /* first start state */

#040 

 

设置词法分析的文件输入。

#041         if ( ! yyin )

#042             yyin = stdin;

#043 

 

设置词法分析的文件输出。

#044         if ( ! yyout )

#045             yyout = stdout;

#046 

 

创建词法分析的缓冲区。

#047         if ( ! yy_current_buffer )

#048             yy_current_buffer =

#049                 yy_create_buffer( yyin, YY_BUF_SIZE );

#050 

#051         yy_load_buffer_state();

#052         }

#053 

 

 

下面一段是词法动作的分析:

#001  do_action: /* This label is used only to access EOF actions. */

#002 

#003 

 

根据动作的状态来响应。

#004         switch ( yy_act )

#005     { /* beginning of action switch */

#006             case 0: /* must back up */

#007             /* undo the effects of YY_DO_BEFORE_ACTION */

#008             *yy_cp = yy_hold_char;

#009             yy_cp = yy_last_accepting_cpos;

#010             yy_current_state = yy_last_accepting_state;

#011             goto yy_find_action;

#012 

 

不同的规则处理。

#013  case 1:

#014  YY_RULE_SETUP

#015  #line 63 "indra.l"

#016  { gInternalLine++; gInternalColumn = 0; comment(); }

#017     YY_BREAK

#018  case 2:

#019  YY_RULE_SETUP

#020  #line 65 "indra.l"

#021  { count(); return(INTEGER); }

#022     YY_BREAK

#023  case 3:

#024  YY_RULE_SETUP

#025  #line 66 "indra.l"

#026  { count(); return(FLOAT_TYPE); }

#027     YY_BREAK

 

接着下来就是不断地处理不同的规则,下一次再来通过调试来分析怎么样处理一个脚本的。


推荐阅读
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • 最大子序列和(maxsum)【问题描述】输入一个长度为n的整数序列(A1,A2,……,An),从中找出一段连续的长度不超过M的子序列,使得这个序列的和最大。例如:序列1,-3,5 ... [详细]
  • 题目描述Takuru是一名情报强者,所以他想利用他强大的情报搜集能力来当中间商赚差价。Takuru的计划是让Hinae帮他去市场上买一个商品,然后再以另一个价格卖掉它。Takur ... [详细]
  • DescriptionclickmeSolution套路的状压期望DP题。。。考虑倒退期望:设fi,jrolepresentationstyleposi ... [详细]
  • P113:集成日志组件 logback 2彩色日志
    第二步,将控制台的日志改成彩色日志,便于查看修改logback.xml文件。 ... [详细]
  • 本文介绍了C++中省略号类型和参数个数不确定函数参数的使用方法,并提供了一个范例。通过宏定义的方式,可以方便地处理不定参数的情况。文章中给出了具体的代码实现,并对代码进行了解释和说明。这对于需要处理不定参数的情况的程序员来说,是一个很有用的参考资料。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了UVALive6575题目Odd and Even Zeroes的解法,使用了数位dp和找规律的方法。阶乘的定义和性质被介绍,并给出了一些例子。其中,部分阶乘的尾零个数为奇数,部分为偶数。 ... [详细]
  • 本文介绍了三种方法来实现在Win7系统中显示桌面的快捷方式,包括使用任务栏快速启动栏、运行命令和自己创建快捷方式的方法。具体操作步骤详细说明,并提供了保存图标的路径,方便以后使用。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • 本文介绍了一个题目的解法,通过二分答案来解决问题,但困难在于如何进行检查。文章提供了一种逃逸方式,通过移动最慢的宿管来锁门时跑到更居中的位置,从而使所有合格的寝室都居中。文章还提到可以分开判断两边的情况,并使用前缀和的方式来求出在任意时刻能够到达宿管即将锁门的寝室的人数。最后,文章提到可以改成O(n)的直接枚举来解决问题。 ... [详细]
author-avatar
安淡言
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有