热门标签 | 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

 

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


推荐阅读
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
  • OpenMap教程4 – 图层概述
    本文介绍了OpenMap教程4中关于地图图层的内容,包括将ShapeLayer添加到MapBean中的方法,OpenMap支持的图层类型以及使用BufferedLayer创建图像的MapBean。此外,还介绍了Layer背景标志的作用和OMGraphicHandlerLayer的基础层类。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • 使用freemaker生成Java代码的步骤及示例代码
    本文介绍了使用freemaker这个jar包生成Java代码的步骤,通过提前编辑好的模板,可以避免写重复代码。首先需要在springboot的pom.xml文件中加入freemaker的依赖包。然后编写模板,定义要生成的Java类的属性和方法。最后编写生成代码的类,通过加载模板文件和数据模型,生成Java代码文件。本文提供了示例代码,并展示了文件目录结构。 ... [详细]
  • 本文介绍了在PostgreSQL中批量导入数据时的优化方法。包括使用unlogged表、删除重建索引、删除重建外键、禁用触发器、使用COPY方法、批量插入等。同时还提到了一些参数优化的注意事项,如设置effective_cache_size、shared_buffer等,并强调了在导入大量数据后使用analyze命令重新收集统计信息的重要性。 ... [详细]
  • tcpdump 4.5.1 crash 深入分析
    tcpdump 4.5.1 crash 深入分析 ... [详细]
  • Question该提问来源于开源项目:react-native-device-info/react-native-device-info ... [详细]
  • 设备模型三(潜谈sysfs)
    前言引出一个问题:假设sysaxx,xx是kobja的属性文件,当对xx进行写操作时,即echo‘1’sysaxx实际上,调用了kobja的ktype中定义的接口函 ... [详细]
author-avatar
amwaysuju
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有