首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >yyllocp->第一行在reEntrant Bison解析器的第二次迭代中返回未初始化的值

yyllocp->第一行在reEntrant Bison解析器的第二次迭代中返回未初始化的值
EN

Stack Overflow用户
提问于 2020-01-15 07:10:19
回答 1查看 249关注 0票数 0

我有一个reEntrant解析器,它从字符串中获取输入,并具有维护上下文的结构。调用一个函数时,要解析不同的输入字符串。该职能的相关代码是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void parseMyString(inputToBeParsed) {

 //LEXICAL COMPONENT - INITIATE LEX PROCESSING
   yyscan_t scanner;    
   YY_BUFFER_STATE  buffer;
   yylex_init_extra(&parseSupportStruct, &scanner );
   //yylex_init(&scanner);

   buffer = yy_scan_buffer(inputToBeParsed, i+2, scanner);

   if (buffer == NULL) {
       strcpy(errorStrings,"YY_BUFFER_STATE returned NULL pointer\n");
       return (-1);
   }


//BISON PART - THE ACTUAL PARSER
yyparse(scanner, &parseSupportStruct);

...

yylex_destroy(scanner);
...
}

我的.l选项是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 %option noinput nounput noyywrap 8bit nodefault                                 
 %option yylineno
 %option reentrant bison-bridge bison-locations                                  
 %option extra-type="parseSupportStructType *"

来自.y的相关行是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  %define api.pure full
  %locations
  %param { yyscan_t scanner }
  %parse-param { parseSupportStructType* parseSupportStruct}
  %code {
    int yylex(YYSTYPE* yylvalp, YYLTYPE* yyllocp, yyscan_t scanner);
    void yyerror(YYLTYPE* yyllocp, yyscan_t unused, parseSupportStructType* parseSupportStruct,  const char* msg);
    char *yyget_text (yyscan_t);
    char *strcpy(char *, const char *);
  }
  %union {
     int numval;
     char *strval;
     double floatval; 
  }

在我的解析器中,在某些规则中,我尝试访问yyllocp->_line。在第一次调用parseMyString(.)时,我得到了正确的值。第二次,我得到一些未初始化的值。是否需要在每次调用parseMyString时初始化yyllocp->第一行?我知道我已经给出了部分的、经过修改的代码来解释这种情况。很乐意提供更多的细节。

使用val差制,我已经尽可能地删除了内存泄漏,但是一些第三方库问题超出了我的控制范围。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-15 12:12:31

flex或bison中没有任何东西能够维护yylloc的价值。

Bison解析器(推送分析器除外)将初始化该变量。(如果您接受默认的位置类型--也就是说,您不接受#define YYLTYPE -- yylloc将初始化为{1, 1, 1, 1}。否则,无论它是什么类型,它都将是零初始化的。)Bison还生成代码,根据非终端的第一个和最后一个子节点的位置计算非终端的位置。Flex生成的代码根本不涉及location对象。

如果要求启用此功能,则flex扫描器会自动维护yylineno

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
%option yylineno

Flex通常可以比您更有效地完成这个任务,并且它处理所有的拐角处情况(yylessyymoreinput()REJECT)。因此,如果您想跟踪线路号码,我强烈建议让flex做它。

但是,flex的yylineno支持有一个重要的问题。在可重入扫描器中,行号存储在每个flex缓冲区中,而不是存储在扫描器状态对象中。这几乎肯定是存储它的正确位置,IMHO,因为如果您使用多个缓冲区,它们可能代表多个输入流,通常您会想要引用它的文件中的一行数。但是yy_scan_buffer并没有初始化这个字段。(因此,yy_scan_stringyy_scan_bytes也是如此,它们只是yy_scan_buffer的包装器。)

因此,如果您使用的是yy_scan_*接口之一,则应该在yy_scan_*之后立即调用yyset_lineno来重置yy_scan_*。就你而言,这将是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
buffer = yy_scan_buffer(inputToBeParsed, i+2, scanner);
yyset_lineno(1, scanner);

一旦获得了yylineno,就很容易维护yylloc对象。Flex有一个钩子,它允许您在执行模式的任何操作之前注入代码(即使操作是空的),并且可以使用这个钩子自动维护yylloc。在this answer中,我提供了这个技术的一个简单示例(它依赖于由flex生成的扫描器维护的yylineno ):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#define YY_USER_ACTION                                             \
  yylloc->first_line = yylloc->last_line;                          \
  yylloc->first_column = yylloc->last_column;                      \
  if (yylloc->last_line == yylineno)                               \
    yylloc->last_column += yyleng;                                 \
  else {                                                           \
    yylloc->last_line = yylineno;                                  \
    yylloc->last_column = yytext + yyleng - strrchr(yytext, '\n'); \
  }

正如该答复中的说明所指出的,上述内容并不是完全笼统的,但在许多情况下是可行的:

这个YY_USER_ACTION宏应该适用于任何不使用yyless()yymore()input()REJECT的扫描器。正确地处理这些特性并不太困难,但它似乎超出了这里的范围。

您无法在操作之前处理yyless()yymore()REJECT (因为在操作之前不可能知道它们是否会被执行),因此,在使用这些功能的应用程序中,更健壮的位置跟踪器必须包括修复yylloc()的代码。

yylineno.

  • For
  • For yyless(),上述设置last_linelast_column的代码可以在yyless()调用后重新执行,因为flex扫描器将修复yylengyyleng REJECT,因此无法在REJECT之后插入代码。处理它的唯一方法是保留yylloc的备份,并在REJECT宏之前立即恢复它。(我强烈建议不要使用REJECT。它效率极低,几乎总是可以用调用yyless()和start yyless() yymore()的组合来代替,yylloc仍然是正确的,但是下一个操作不能覆盖令牌启动位置。正确的操作可能需要维护一个标志来指示是否调用了yymore()
  • For input(),如果您希望将读取的字符视为当前令牌的一部分,则可以在调用input() (这需要区分返回换行符、文件结束指示符或常规字符)之后,在yylloc中推进结束位置。或者,如果您希望使用input()读取的字符不被视为任何令牌的一部分,则需要放弃使用前一个令牌的结束位置作为当前令牌的起始位置的想法,这将需要保留一个分隔位置值作为下一个令牌的开始位置。
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59754253

复制
相关文章
git 取消跟踪
这样就可以了,如果后面跟的是目录就加上个 -r 就行了 (这个操作不会删除这个文件)
潇洒
2019/07/03
9490
git取消文件跟踪
在使用git的时候,有些文件是不需要上传的,所以就可以修改   .gitignore 
lin_zone
2018/08/15
1.3K0
git取消文件跟踪
git 取消文件跟踪
git rm --cached readme1.txt    删除readme1.txt的跟踪,并保留在本地。
西湖醋鱼
2020/12/30
1.5K0
git取消文件跟踪
在使用git的时候,有些文件是不需要上传的,所以就可以修改 .gitignore
全栈程序员站长
2022/07/07
1.5K0
git取消文件跟踪
git取消跟踪文件
取消跟踪文件: $git rm --cached FILENAME 取消跟踪目录: $git rm --cached FILENAME -r   最佳解决方案: 先清空,再加回来。 git rm -r --cached . #删除追踪状态 git add . git commit -m "fixed untracked files"
Ryan-Miao
2018/03/13
7540
git取消跟踪已版本控制的文件
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/119558.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/11
3280
Git 取消跟踪已版本控制的文件
Git 是一个很好的版本控制工具,当然驾驭起来相比 SVN 要稍微复杂一些。初入 Git,难免有一些问题。比如我们不小心将某个文件加入了版本控制,但是突然又不想继续跟踪控制这个文件了,怎么办呢?
技术小黑屋
2018/09/04
1.6K0
PHP打印跟踪调试信息
对于大部分编译型语言来说,比如 C 、 Java 、 C# ,我们都能很方便地进行断点调试,但是 PHP 则必须安装 XDebug 并且在编辑器中进行复杂的配置才能实现断点调试的能力。不过,如果只是简单的调试并且查看堆栈回溯的话,其实 PHP 已经为我们准备好了两个函数,能够让我们非常方便的看到程序运行时的调用情况。
硬核项目经理
2020/07/06
2K0
JQ + PHP + TrackMore物流信息跟踪
在使用之前,您需要先去trackmore官方网站申请API_KEY,传送门:TrackMore
Yiiven
2022/12/15
1.7K0
JQ + PHP + TrackMore物流信息跟踪
使用BTrace性能跟踪
BTrace是一个开源项目,开始于2007年,名声鹊起得益于2008年的JavaOne会议。
物流IT圈
2019/07/16
5820
使用BTrace性能跟踪
【目标跟踪】开源 | PolyTrack:使用边界多边形快速进行多目标跟踪和分割,替代包围框和遮罩跟踪
论文地址: http://arxiv.org/pdf/2111.01606v1.pdf
CNNer
2022/02/09
8720
【目标跟踪】开源 | PolyTrack:使用边界多边形快速进行多目标跟踪和分割,替代包围框和遮罩跟踪
度量,跟踪和日志记录
今天,我有幸参加了2017年的分布式追踪峰会,其中有很多来自AWS / X-Ray,OpenZipkin,OpenTracing,Instana,Datadog,Librato等公司的人员,我很遗憾我忘记了这一点。有一次讨论转向了项目范围和定义。跟踪系统是否也应该管理日志记录?什么确实的记录,通过在室内所代表的不同的镜头看?所有各种混凝土系统在哪里适合图片?
Java架构师必看
2021/07/13
7760
InnoDB克隆和页面跟踪
首先,我们将讨论支持InnoDB克隆技术的一些内部产品。MySQL企业版备份(MEB)是一种企业级产品,可为MySQL提供备份和恢复。在各种类型的备份中,我们关注下面两种类型:
MySQLSE
2021/01/08
1K0
跟踪综述推荐:目标跟踪40年
《中国图象图形学报》2019年第12期封面故事聚焦目标跟踪,对基于深度学习的目标跟踪算法进行系统的梳理。该成果是中国图象图形学学会机器视觉专委会牵头组织,浙江大学李玺教授、厦门大学王菡子教授等八位老师联名撰写的图像图形学科年度发展报告。
CV君
2020/02/12
2.3K0
跟踪算法(一)光流法跟踪
COPY FROM:http://blog.csdn.net/crzy_sparrow/article/details/7407604
全栈程序员站长
2022/09/15
1.2K0
Git 取消跟踪已版本控制的文件(亲测可行)
git 不再追踪文件改动 git update-index –assume-unchanged filePath
全栈程序员站长
2022/07/07
4150
事件相机特征跟踪-模板跟踪方法
由于事件相机不能提供完整的图像,所以最初的特征跟踪依赖传统相机的数据。本推送介绍事件相机特征检测与跟踪的一篇较早的工作:Feature Detection and Tracking with the Dynamic and Active-pixelVision Sensor (DAVIS),由ETH发表于2016年,衍生出了其它的方法,也被作为一类典型的特征追踪思路,即利用传统图形进行初始化与跟踪。
3D视觉工坊
2020/12/11
1K0
事件相机特征跟踪-模板跟踪方法
使用strace跟踪多进程程序
要跟踪的Taskdemo.php代码如下(即之前使用swoole实现的生产者消费者模型)。
跑马溜溜的球
2020/12/07
3K0
基于HTML5的Canvas指纹跟踪技术
时至今日有许多的方式来跟踪访客,例如使用存在用户端的cookie技术,这种技术现已被大部分公司遗弃,如今出现了一种新的方法替代cookie可以来跟踪用户。 在这两年中,许多网站和跟踪软件都开始利用HTML5 canvas指纹。PS:Canvas是HTML5中动态绘图的标签。 每个浏览器生成不一样的图案 从根本上来说,每一种浏览器都会使用不同的图像处理引擎,不同的导出选项,不同的压缩等级,所以每一台电脑绘制出的图形都会有些许不同,这些图案可以被用来给用户设备分配特定编号(指纹),也就是说可以用来识别不同用户。
FB客服
2018/02/02
1.9K2
sqlserver使用存储过程跟踪SQL
USE [master] GO /****** Object: StoredProcedure [dbo].[sp_perfworkload_trace_start] Script Date: 2017/7/6 19:48:52 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO
易墨
2018/09/14
1.7K0

相似问题

如何裁剪图像并使其具有响应性?

10

如何使其具有响应性?

118

如何更改标题的宽度并使其也具有响应性

219

如何在MUI中居中组件并使其具有响应性?

8113

我是否可以使用Bootstrap列来创建此分区,并使其具有响应性?

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文