lex & yacc 获取当前位置

2023-12-07

在 lex & yacc 中有一个名为 YY_INPUT 的宏,可以重新定义,例如以这样的方式

#define YY_INPUT(buf,result,maxlen) do { \
 const int n = gzread(gz_yyin, buf, maxlen); \                                                                              
 if (n < 0) { \
       int errNumber = 0; \
       reportError( gzerror(gz_yyin, &errNumber)); } \
     \
     result = n > 0 ? n : YY_NULL; \
  } while (0)

我有一些称为 YYACCEPT 宏的语法规则。 如果在 YYACCEPT 之后我调用了 gztell (或 ftell),那么我得到了一个错误的号码,因为解析器已经读取了一些不必要的数据。

那么,如果我有一些名为 YYACCEPT 的规则,我如何获得当前位置(一个不好的解决方案是逐个字符读取)

(我已经做了这样的事情:

#define YY_USER_ACTION do { \
        current_position += yyleng; \
} while (0)   

但似乎不起作用 )


您必须自己跟踪偏移量。一个简单但烦人的解决方案是:

offset += yyleng;

in every弯曲动作。幸运的是,您可以通过定义YY_USER_ACTION宏,在令牌操作之前执行。

这可能仍然不适合你的语法,因为bison经常先读一个令牌。所以你还需要附加值offset对于每个词汇标记,最方便地使用位置工具(yylloc).

编辑:添加了有关位置跟踪的更多详细信息。

以下未经过测试。您应该阅读以下两个部分中的部分flexbison有关位置跟踪的手册。

The yylloc如果您使用,全局变量及其默认类型将包含在生成的 bison 代码中--locations命令行选项或%locations指令,或者如果您只是在某些规则中引用位置值,请使用@语法,类似于$语法(即@n是右侧对象的位置值,其语义值为$n)。不幸的是,默认类型yylloc uses ints,它们的宽度不足以容纳文件偏移量,尽管您可能不打算解析这很重要的文件。无论如何,改变都很容易;你只需要#define the YYLTYPE宏在你的顶部bison文件。默认YYLTYPE is:

typedef struct YYLTYPE
     {
       int first_line;
       int first_column;
       int last_line;
       int last_column;
     } YYLTYPE;

对于最小的修改,我建议保持名称不变;否则你还需要修复YYLLOC_DEFAULT宏在你的bison文件。默认YYLLOC_DEFAULT确保非终端获得一个位置值,其first_line and first_column成员来自非终结符 RHS 中的第一个元素,其last_line and last_column成员来自最后一个元素。由于它是一个宏,因此它可以与各种成员的任何可分配类型一起使用,因此更改column会员到long, size_t or offset_t,只要你觉得合适:

#define YYLTYPE yyltype;
typedef struct yyltype {
  int first_line;
  offset_t first_column;
  int last_line;
  offset_t last_column;
} yyltype;

然后在你的flex输入,您可以定义YY_USER_ACTION macro:

offset_t offset;
extern YYLTYPE yylloc;

#define YY_USER_ACTION         \
  offset += yyleng;            \
  yylloc.last_line = yylineno; \
  yylloc.last_column = offset;

完成所有这些并进行适当的初始化后,您应该能够使用适当的@n.last_column in the ACCEPT规则来提取接受的输入中最后一个标记末尾的偏移量。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

lex & yacc 获取当前位置 的相关文章

  • 裸机交叉编译器输入

    裸机交叉编译器的输入限制是什么 比如它不编译带有指针或 malloc 的程序 或者任何需要比底层硬件更多的东西 以及如何才能找到这些限制 我还想问 我为目标 mips 构建了一个交叉编译器 我需要使用这个交叉编译器创建一个 mips 可执行
  • Java 语言有 Java 解析器吗?

    我正在寻找一个 java 库 它允许我解析 java 源文件 并为我提供代码的 AST 表示 实际上我只对类和方法定义及其注释感兴趣 我不需要方法代码的 AST 我正在使用这些信息来生成代码 这就是为什么我无法先编译源文件以从生成的类文件中
  • 使用 IFS bash 进行 CSV 解析:选择“;”作为分隔符

    我有一个包含 130 列的 CSV 我需要用它来做 3 个 csv 我用 while 和 IFS 循环 因为我需要对每一行的变量进行一些处理 这是我所做的 while IFS read my 130 vars what i do with
  • javax.xml.transform.TransformerException: java.io.FileNotFoundException: (访问被拒绝)

    我在最后一行代码中遇到异常 Transformer transformer TransformerFactory newInstance newTransformer DOMSource xmlSource new DOMSource do
  • C# 中的快速字符串解析

    在 C 中解析字符串最快的方法是什么 目前我只是使用字符串索引 string index 并且代码运行合理 但我忍不住认为索引访问器所做的连续范围检查必须添加一些东西 所以 我想知道我应该考虑哪些技术来增强它 这些是我最初的想法 问题 使用
  • 引用与指针的执行速度

    我最近阅读了一篇关于托管语言是否比本机语言 特别是 C 与 C 慢 或快 的讨论 一位参与讨论的人士表示 托管语言的 JIT 编译器将能够对引用进行优化 而这在使用指针的语言中是不可能实现的 我想知道的是 对于引用而不是指针可以进行 什么样
  • Python BeautifulSoup XML 解析

    我编写了一个简单的脚本来使用 BeautifulSoup 模块解析 XML 聊天日志 标准 soup prettify 工作正常 只是聊天日志中有很多绒毛 您可以在下面看到我正在使用的脚本代码和一些 XML 输入文件 Code import
  • BISON + FLEX 语法 - 为什么标记被连接在一起

    我想了解为什么 BISON 按照以下规则连接两个标记 stmt declaration assignment exp ID lt this rule fprintf stderr n my id is s 1 如果你检查输出就会明白我的意思
  • 获取单个方程的脚本

    在文本文件中输入 a 2 8 b 3 9 c 4 8 d 5 9 e a b f c d g 0 6 h 1 7 i e g j f h output i j 期望的输出 输出 2 8 3 9 0 6 4 8 5 9 1 7 如果输入文件名
  • HTML 解析 - 从 div 内的表格获取数据?

    我对 HTML 解析 抓取的整个想法还比较陌生 我希望我能来这里获得我需要的帮助 基本上我想要做的 我认为 是指定我希望从中获取数据的页面的 url 在这种情况下 http www epgpweb com guild us Caelestr
  • 如何增加使用 SAX 解析 XML 文件的entityExpansionLimit

    我正在尝试使用 Java 中的 SAX 解析器解析一个 1 23 GB 的 XML 文件 我使用的是 Mac 操作系统和 JDK 1 7 0 51 不幸的是 我收到以下错误 The pasrser has encountered more
  • 如何使用 alex/haskell 执行 python 风格的缩进/缩进标记?

    我正在用 Haskell 为 Alex 中的一种小语言编写一个词法分析器 该语言被指定为具有 python 式的显着缩进 只要缩进级别发生变化 就会发出 INDENT 标记或 DEDENT 标记 在像 C 这样的传统命令式语言中 您将在词法
  • Javascript 和自动分号插入

    test262 http test262 ecmascript org测试套件有test http hg ecmascript org tests test262 file 927ea8563f7f test suite ch07 7 9
  • D3 删除千位的逗号分隔符

    我有一个包含 3 列的 json 其中一列是 年份 该列仅包含年份 没有日期 当我在 x 轴上绘制它时 年份会以逗号分隔符表示数千 所以在 json 中 日期的格式是 Year 1990 在 x 轴上 结果是 1 990 我一直在试图弄清楚
  • 从电话号码确定国际电话代码的算法

    我可以使用 iOS 上的地址簿框架从设备中检索联系人的电话号码 如何区分或识别哪个是国家 地区代码 哪个是实际电话号码 是否可以 国家 地区代码是一个相当混乱的主题 但足够标准 通过一些程序员维护就可以解决它 您可以通过其初始子序列来识别国
  • 用于打印 C/C++ 文件的所有函数定义的 Python 脚本

    我想要一个 python 脚本来打印 C C 文件中定义的所有函数的列表 e g abc c定义两个函数为 void func1 int func2 int i printf d i return 1 我只想搜索文件 abc c 并打印其中
  • 如何在批处理文件中解析带有特殊分隔符的文件?

    我想使用批处理来解析一个如下所示的文件 a string containing various characters and spaces 1 b string containing various characters and space
  • 什么是应用程序二进制接口 (ABI)?

    我从来没有清楚地理解什么是 ABI 请不要向我指出维基百科文章 如果我能理解的话 我就不会在这里发这么长的帖子了 这是我对不同接口的看法 电视遥控器是用户和电视之间的接口 它是一个现有的实体 但本身没有用 不提供任何功能 遥控器上每个按钮的
  • LEX- yylineno 返回 1

    我尝试了很多网上给出的解决方案 我尝试过的解决方案之一来自此链接 Flex yylineno 设置为 1 https stackoverflow com questions 13317634 flex yylineno set to 1 但
  • 从 HTML 文件中获取 jpg 图像

    我正在尝试使用 grep 获取 HTML 文件中 jpg 图像的完整 url 地址 一个问题是其中没有很多换行符 所以当我使用 grep 时 它会获取路径 但也会获取很多我不感兴趣的其他内容 我怎样才能获取 jpg 图像的 url 一张单人

随机推荐

  • GAE 通过 app.yaml、python 装饰器或 users.get_current_user 强制登录?

    我在 GAE 应用程序的 app yaml 配置文件中使用 登录 选项 看起来像这样 url admin script myapp app login admin url script myapp app login required 更新
  • Pandas 用最后一个已知值填充空尾随值

    我有几个具有不同结束时间段的专栏 需要用最后一个已知值填充空数据 有没有一种 Pandas 方法可以做到这一点 而无需在结束日期上循环 我需要过去 4 个月的 Gain sum y 等于 57129 0 gain sum x gain su
  • JSF - @PostConstruct 可以使用 ajax 调用来阻止 setter 方法吗?

    我想这个问题从标题就已经很清楚了 这是我真正的豆子 ManagedBean name selector RequestScoped public class Selector private String profilePage PostC
  • “静态只读”与“常量”

    我读过有关const and static readonly字段 我们有一些只包含常量值的类 它们用于我们系统中的各种事物 所以我想知道我的观察是否正确 这些常数值是否应该始终是static readonly对于所有公开的事情 并且只使用c
  • 将选项卡名称和 ConqueShell 与 Vim 会话一起保存

    有没有办法让 vim 保存选项卡名称 通过分配选项卡名称脚本 和 或终端仿真器 通过设置康克外壳脚本 发出后 mksession fileName 命令 观察下面 放大 我在左侧有一个工作会话 并且通过vim S fileName命令 在右
  • Spark.sql.shuffle.partitions 到底指什么?

    到底是做什么的spark sql shuffle partitions参考 我们谈论的是宽变换结果的分区数量 还是中间发生的事情 例如宽变换结果分区之前的某种中间分区 因为根据我的理解 根据广泛的转变 我们有 Parents RDDs gt
  • 无法推导出模板参数(向量、std::function)

    我创建了一个模板化函数 我试图自动推导模板参数 MCVE 编译它 template
  • 当隔离被杀死时,颤振隔离内的计时器不会停止

    我有一个应用程序使用 API 调用将操纵杆位置数据上传到网络服务器 当操纵杆移动时会调用此方法 如果操纵杆不在中心 它将停止任何先前运行的隔离并启动新的隔离 void onJoystickMoved double angle double
  • 在 FormFlows - Bot Framework 中添加另一个 Quit 关键字

    是否可以使用 Bot Framework 更改 FormDialog 中退出突击队的关键字 我想在键入某个单词时抛出 FormCanceledException 不使用英语作为语言 如果我可以更改关键字 或者添加另一个与退出相同的关键字 那
  • 安卓图像按钮

    如何创建一个没有文本且图像水平居中的按钮 我不想使用图像按钮 因为我想定义不同的背景图像 您只需使用 ImageButton 并将背景设置为您想要的任何内容并将图标设置为 src
  • Tinder 像泛 iOS

    对于 iOS 中的 Tinder 应用程序 我假设他们在图像视图上使用平移手势识别器 为什么用户开始移动的图像下方会显示另一张图像 他们是否有另一个图像视图 并且在手势识别器完成后 动态设置图像视图手势识别器 最后在下面创建另一个图像视图
  • 使用自定义名称创建 Python 动态函数

    如果这个问题已经提出并得到回答 我们深表歉意 我需要做的概念非常简单 但不幸的是我无法在网上找到答案 我需要在运行时使用自定义名称在 Python Python2 7 中创建动态函数 每个函数的主体也需要在运行时构造 但对于所有函数来说 几
  • Stripe Payment API 与 Jetpack Compose 集成

    我不明白如何将 Stripe API 集成到 Compose 应用程序中 这是 Stripe 提供的代码片段 class CheckoutActivity AppCompatActivity lateinit var paymentShee
  • 如何检测可可中的右键单击和左键单击

    我想创建一个点击鼠标右键和左键的动作 单击可能会在 NSTableViewCell NSView 等上 就像我们右键单击窗口时会弹出一个窗口 有没有API可以完成这样的任务 如果没有 还有其他办法吗 预先感谢您对我的帮助 你必须覆盖NS响应
  • pickling 和 unpickling 用户定义的类

    我有一个用户定义的类 myclass 我将其存储在文件中pickle模块 但我在解封它时遇到问题 我有大约 20 个相同结构的不同实例 我将它们保存在不同的文件中 当我读取每个文件时 代码适用于某些文件 而不适用于其他文件 当我收到错误时
  • 计算大圆距离矩阵

    dist coords 使用欧几里得距离提供距离矩阵 它还提供了其他几个选项 但它没有提供任何选项 例如半正矢公式 distHaversine 计算给定的两组纬度 经度坐标我想要的距离 大圆 我想知道是否有一个现有的包 函数可以使用半正矢公
  • 如何在接口中公开方法而不将其公开给所有类

    我遇到一个问题 我正在使用特定的界面来处理很多事情 但是 我有一个特定的方法 我希望它仅适用于特定的一组类 基本上是一个internal方法 interface IThing function thisMethodIsPublic void
  • 无法在 Laravel 8 bootstrap 上编译 sass 文件

    当我尝试在 Laravel 版本 8 上编译引导脚手架时 出现以下错误 node modules bootstrap scss mixins grid scss 67 16 row cols node modules bootstrap s
  • Sass ID 选择器在 React 和 create-react-library 中不起作用

    我有一个正在制作的图书馆Header组件和一个Button成分 我给了他们 ID 以在我的 SASS 文件中识别他们 这是我目前的情况 index js import React from react import styles modul
  • lex & yacc 获取当前位置

    在 lex yacc 中有一个名为 YY INPUT 的宏 可以重新定义 例如以这样的方式 define YY INPUT buf result maxlen do const int n gzread gz yyin buf maxlen