Flex 可重入以用户特定状态启动

2023-12-27

Flex 设置YY_STATE to INITIAL默认情况下,当yyscan_t叫做。 我正在尝试制作一个可重入扫描仪,可以从特定于用户的状态而不是 INITIAL。

这是案例

/* comment start       //not passed into flex
   in comment          //first line passed into flex
   end of comment*/    //second line passed into flex

由于某些原因这些2线路是分别地馈入可重入扫描仪和该行所属的 YY_STATE 是已知的。我需要的是通过评论状态进入可重入柔性和开关YY_STATE to COMMENT开始词法分析之前 in comment\n。 我的解决方法是在行首添加一个虚拟令牌并将状态传递为yyextra进入柔性。一旦识别出虚拟令牌,就切换到特定状态。因此,flex 开始用特定的 YY_STATE 来词法该行。然而,在每行的开头添加虚拟标记非常耗时。

这是我以前调用可重入 Flex 的方式:

yyscan_t scanner;                                                                                                                                                                                                                
YY_BUFFER_STATE buffer;                                                                                                                                                                                                          
yylex_init(&scanner);                                                                                                                                                                                                            
buffer = yy_scan_string(inputStr, scanner);                                                                                                                                                                                      
yyset_extra(someStructure, scanner);                                                                                                                                                                                                       
yylex(scanner);                                                                                                                                                                                                                  
yy_delete_buffer(buffer, scanner);                                                                                                                                                                                               
yylex_destroy(scanner); 

是否可以先设置YY_STATEyylex(scanner)叫做 ?


如果您只是打电话yylex每个输入行一次,然后您可以添加一个额外的参数yylex它提供了要切换到的启动条件,并将启动条件设置在 yylex 的顶部。

但是没有简单的方法可以从 Flex 文件外部引用开始条件,也没有方便的方法从 Flex 文件中提取当前的开始条件。yystate_t目的。您声称拥有此信息的事实表明您在更改启动状态时将其存储在某个位置,因此您可以在启动时从同一位置恢复启动状态yylex。存储信息的最简单的地方是yyextra对象,所以这是此示例代码的基础:

文件begin.int.h

/* This is the internal header file, which defines the extra data structure
 * and, in this case, the tokens.
 */
#ifndef BEGIN_INT_H
#define BEGIN_INT_H

struct Extra {
  int start;
};

enum Tokens { WORD = 256 };

#endif

文件开始.h

/* This is the external header, which includes the header produced by
 * flex. That header cannot itself be included in the flex-generated code,
 * and it depends on the internal header. So the order of includes here is
 * (sadly) important.
 */
#ifndef BEGIN_H_
#define BEGIN_H_

#include "begin.int.h"
#include "begin.lex.h"

#endif

文件:开始.l

/* Very simple lexer, whose only purpose is to drop comments. */
%option noinput nounput noyywrap nodefault 8bit
%option reentrant
%option extra-type="struct Extra*"
%{
#include "begin.int.h"
/* This macro ensures that start condition changes are saved */
#define MY_BEGIN(s) BEGIN(yyextra->start = s)
%}

%x IN_COMMENT
%%
  /* See note below */
  BEGIN (yyextra->start);
"/*"          MY_BEGIN(IN_COMMENT);
[[:alnum:]]+  return WORD;
[[:space:]]+  ;
.             return yytext[0];

<IN_COMMENT>{
  "*/"        MY_BEGIN(INITIAL);
  .|[^*]+     ;
}

Note:

第一个之后的任何缩进代码%%并且在第一个模式插入之前yylex;在它之前执行的唯一一件事是一次性初始化yystate_t对象,如果有必要的话。

文件begin.main.c

/* Simple driver which creates and destroys a scanner object for every line
 * of input. Note, however, that it reuses the extra data object, which holds
 * persistent information (in this case, the current start condition).
 */
#include <stdio.h>
#include "begin.h"

int main ( int argc, char * argv[] ) {
  char* buffer = NULL;
  size_t buflen = 0;

  struct Extra my_extra = {0};

  for (;;) {
    ssize_t nr = getline(&buffer, &buflen, stdin);
    if (nr < 0) break;
    if (nr == 0) continue; 

    yyscan_t scanner;
    yylex_init_extra(&my_extra, &scanner);

    /* Ensure there are two NUL bytes for yy_scan_buffer */
    if (buflen < nr + 2) {
      buffer = realloc(buffer, nr + 2);
      buflen = nr + 2;
    }
    buffer[nr + 1] = 0;
    YY_BUFFER_STATE b = yy_scan_buffer(buffer, nr + 2, scanner);

    for (;;) {
      int token = yylex(scanner);
      if (token == 0) break;
      printf("%d: '%s'\n", token, yyget_text(scanner));
    }
    yy_delete_buffer(b, scanner);
    yylex_destroy(scanner);
  }
  return 0;
}

Build:

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

Flex 可重入以用户特定状态启动 的相关文章

  • 使用 Flex/Bison 的解释器 REPL

    我已经为类 C 语言编写了一个解释器 使用 Flex 和 Bison 作为扫描器 解析器 执行完整的程序文件时它工作正常 现在我正在尝试在解释器中实现 REPL 以供交互式使用 我希望它像 Ruby 或 ML 中的命令行解释器一样工作 显示
  • 为什么这个野牛代码会产生意外的输出?

    弹性代码 1 option noyywrap nodefault yylineno case insensitive 2 3 include stdio h 4 include tp tab h 5 6 7 8 return 9 retur
  • flex 中的引号“”

    我正在用 Flex 编写一个简单的扫描仪 我希望我的扫描仪在看到关键字 int 时打印出 看到的整数类型 下面两种方式有什么区别吗 1st way int printf integer type seen 2nd way int print
  • 线程安全/可重入 bison + flex

    与任何解释相比 我真的更喜欢一个工作示例 到目前为止 我在 Bison 文档网站上读到的内容与 Flex 所说的内容相矛盾 一说要申报yylex as int yylex yyscan t yyscanner 另一位希望它是 int yyl
  • 如何处理flex中的嵌套注释

    我正在为支持嵌套注释的语言编写一个 Flex 扫描器 如下所示 我曾经在支持递归调用 lex 扫描器的 ocaml ocamllex 上工作 非常优雅 但我现在切换到c flex 如何处理这样的嵌套注释 假设只有注释可以嵌套在注释中 那么对
  • flex / bison:如何在同一输入文件上切换两个词法分析器

    我如何移交打开的文件 例如由另一个扫描仪读取到下一个扫描仪 并将其交给解析器 Flex 缓冲区无法轻松地从一台扫描仪传输到另一台扫描仪 许多细节对于扫描仪来说是私有的 需要进行逆向工程 从而导致可维护性的丧失 然而 只要语义类型兼容 将两个
  • Lex 正则表达式获得一些额外的字符

    我的 lex 文件中有以下定义 L a zA Z A a zA Z 0 9 L A yylval id yytext return IDENTIFIER 我在 YACC 文件中执行以下操作 primary expression IDENTI
  • YAML 解析 - lex 还是手工?

    我正在尝试编写一个简单的 YAML 解析器 我从 yaml org 阅读了规范 在开始之前 我想知道是否编写一个手卷解析器更好 或者 使用lex flex bison 我看了看libyaml C 库 好像没用lex yacc YAML 不包
  • 需要帮助确定“默认操作类型冲突”的原因

    我一直在做一项学校作业 但很难弄清楚哪个问题导致了 默认操作类型冲突 下面的多个警告 任何帮助将不胜感激 收到的警告 parser y 62 9 23 warning type clash on default action
  • 对“yylex”的未定义引用

    我正在尝试使用 flex 和 bison 解析一个输入文件 但在编译程序时遇到一个困难 我附上了我的 Flex 和 Bison 代码以及我收到的错误 请帮我解决这些错误 lex l include
  • 将 Flex/Bison 与外部程序集成

    我正在开发一个智能代理模型 该模型需要事件列表作为输入 这些事件来自另一个模型的输出 位于 大 文本文件中 文本文件是所有事件的列表 包括我不关心的不必要事件 因此我使用 flex 编写了一个扫描器 可以找到有用的位 智能代理模型的框架已经
  • Flex 默认规则

    如何自定义 Flex 的默认操作 我发现类似 的内容 但当我运行它时 它显示 柔性扫描仪卡住 还有 规则仅添加一条规则 因此它也不起作用 我想要的是 comment comment return 1 default return 0 lt
  • 是否可以设置规则的优先级以避免“最长最早”的匹配模式?

    另一个简单的问题 有没有办法告诉 flex 更喜欢匹配短事物的规则而不是匹配长事物的规则 我找不到任何关于这方面的好的文档 这就是我需要它的原因 我解析一个伪语言文件 其中包含一些与控制指令相对应的关键字 我希望它们成为绝对优先级 这样它们
  • 使用 flex 将 Python 多行字符串与转义字符匹配

    我想知道如何将 python 多行注释与 flex 相匹配 我遇到了一些麻烦 以下工作正常Regexr https regexr com 但不被flex识别 我不知道如何修复它 1 2 以前 我使用过 3 0 2 3 它可以检测以下评论 A
  • 使用 Flex 和 Bison 编译时未定义对“_yyerror”的引用

    我正在尝试为迷你 Pascal 语言制作一个编译器 我为此使用了 Flex 和 Bison 并且出现了这个错误 我的 Flex 文件 include y tab h include
  • GNU Flex 库 libfl 提供什么?

    我可以从 flex 和 bison 生成的文件编译一个程序 cc lex yy c program tab c o output 也由 cc lex yy c program tab c lfl o output 它们都运行顺利 没有任何问
  • 用于多行注释的 Unix Flex 正则表达式

    我正在 Unix 上使用 Flex 制作词法分析器 如果您之前使用过它 您就会知道您主要只是为您为其编写词法分析器的任何语言的标记定义正则表达式 我被困在最后一部分 我需要正确的正则表达式来进行多行注释 以允许类似的事情 This is a
  • Flex 和 Bison 彼此需要什么?

    当 Flex 和 Bison 一起使用时 为什么 Flex 文件需要 includebison 创建的 C 头文件 编译需要 bison 和 flex 创建的 C 源文件 bison 和 flex 创建的 C 源文件相互需要什么 bison
  • 当我使用 yymore() 时,在 EOF 处出现 Flex 错误“缓冲区末尾丢失”

    我正在编写一个 Flex 程序来处理字符串常量 当输入文件在字符串中遇到 EOF 时 我想返回一个 ERROR 标记 文件遇到 EOF 并打印 ERROR 后出现以下错误 致命的 Flex 扫描仪内部错误 缓冲区末尾丢失 这是我的代码 可以
  • Bison/Flex 中哪里可以释放内存?

    我使用 Bison 和 Flex 的时间或多或少有 1 个月 所以如果我没有看到明显的东西 但我不认为是 我很抱歉 我在使用 Flex Bison 释放内存时遇到问题 我的代码如下所示 parser l DATE yylval str st

随机推荐

  • JavaScript:V8 问题:小整数是否被合并?

    正在看这个V8设计文档 https docs google com document d 11T2CRex9hXxoJwbYqVQ32yIPMh0uouUZLdyrtmMoL44 edit 其中有一个部分用于Constant Pool En
  • CoreBluetooth配对反馈/回调

    感觉好像我在这里遗漏了一些东西 但是我如何获得有关密码保护的外围设备配对失败还是成功的反馈 当我连接受密码保护的外围设备时 会弹出密码 UIAlertView 并且外围设备会立即连接 调用 didConnectPeripheral 并断开连
  • MS Sql:条件 ORDER BY ASC/DESC 问题

    我想使查询中的排序成为有条件的 因此如果它满足条件 则应按降序排序 例如 SELECT FROM Data ORDER BY SortOrder CASE WHEN Direction 1 THEN DESC END 不要改变ASC or
  • 使用 NLTK 和 WordNet;如何将动词简单时态转换为现在时、过去时或过去分词形式?

    使用 NLTK 和WordNet https en wikipedia org wiki WordNet 如何将动词简单时态转换为现在时 过去时或过去分词形式 例如 我想编写一个函数 它会给我预期形式的动词 如下所示 v go presen
  • Docker:使用 dockerfile 在 Windows 容器上安装 chrome

    我正在尝试在我的 Windows 容器上安装 Chrome 我已经使用 dockerfile 创建了我的 docker 映像 并且我想使用此 dockerfile 安装 chrome 我尝试过使用以下命令 RUN apt get updat
  • 我可以在运行 VS 单元测试时进行调试吗?

    我想对使用自定义事件的用户组件进行单元测试 当不使用 VS 单元测试框架 debug assert 执行此操作时成功 当使用 VS 单元测试框架执行相同的操作时 断言失败 这是不合逻辑的 所以我想在使用 VS 框架进行单元测试时进行调试 但
  • C++ 后端和 C# 前端?

    我有一个项目 在该项目中 我必须每秒处理 100 条 如果不是 1000 条 消息 并相应地在图表上处理 绘制这些数据 用户将搜索一组数据 其中将实时绘制图表 而不必在图表上绘制数千个值 我无法理解使用 DLL 在 C 中进行大量消息处理
  • Android Studio 无法识别我的设备

    问题就在这里 我想在我的设备 Samsung Galaxy Ace 2 上运行 Android Studio 应用程序 但对我来说没有任何作用 告诉我我错过了什么 1 USB调试打开 2 ADB驱动程序已安装 在设备管理器中我可以看到And
  • 将视图或窗口添加到 MainWindow

    我在一些我无法理解的基本概念上遇到了困难 我希望有人能为我解决一些问题 因为我没有找到可以解释这一点的资源 或者也许 它在明亮的地方 但我只是看不到它 到目前为止的理解 主窗口包含菜单 因此或多或少是必要的 这info plist持有笔尖
  • Firebase 错误:TypeError:无法使用“in”运算符在未定义中搜索“_delegate”

    我是 firebase 的新手 过去两天在查询和删除集合中的文档时遇到了一些困难 具体来说 每次启动服务器时 我都会尝试清除公司虚拟数据的整个集合 然后再循环虚拟数据并将其写入集合 以防止重复 我已经能够将我的公司虚拟数据写入我的 公司 集
  • 如何在 Android 模拟器中运行 YouTube 视频

    我制作了一个程序 在列表视图中获取 YouTube 视频列表 并且还实现了 onClick 来源 我遵循了有关如何使用 youtube gdata 的教程 使用来自 youtube 的视频和 onclick 填充列表视图 源代码可在以下位置
  • RestTemplate 与正文一起获取

    如何使用休息模板来获取身体 基于以下问题 通过 JSON 格式的 RestTemplate 进行 POST 请求 https stackoverflow com questions 4075991 post request via rest
  • Fabric Javascript SDK 和 Hyperledger Composer 之间有哪些功能差异?

    除了 Composer 使原型业务网络的部署和测试变得更加容易 以及我们不需要了解 golang 来开发链代码这一事实之外 这些接口提供的功能有何差异 可能会导致人们选择其中之一另一个 这篇文章或许可以为您提供所需的答案 https blo
  • 高精度事件定时器

    include target h include xcp h include LocatedVars h include osek h This task is activated every 10ms long OSTICKDURATIO
  • NSJSONSerialization 不创建可变容器

    这是代码 NSError parseError NSMutableArray listOfObjects NSJSONSerialization JSONObjectWithData dataUsingEncoding NSUTF8Stri
  • 基于标记的 Google 地图居中

    我想根据动态加载的标记将我的 Google 地图居中 我已经看到了 边界 的使用并尝试实现 适合边界 但我无法将其正确应用到我的地图上 这是代码 var MapStart new google maps LatLng 41 664723 9
  • rake 任务中 open-uri 出现 404 错误...是什么原因造成的?

    我有一个 rake 任务 它从 API 获取 JSON 数据 解析它 并将其保存到数据库 task embedly gt environment do require json require uri require open uri Vi
  • PHP - 获取函数的所有参数(甚至是可选参数)

    我想从函数中获取所有参数 传递或未传递 Example 如果我打电话 test func get args foo 10 var dump test 我只会有一个数组 0 gt 10 即使我没有传递可选参数 我怎样才能获得它的值 我知道fu
  • 在 EAR 中的多场战争中共享公共 jsp

    我们有一个包含 13 个模块的大型应用程序 根据客户需求 我们应该能够部署核心模块 客户特定模块 我们计划将应用程序分成多场战争 现在的问题是我们有一些常见的jsp 例如header jsp error jsp等 有什么方法可以让我们将常见
  • Flex 可重入以用户特定状态启动

    Flex 设置YY STATE to INITIAL默认情况下 当yyscan t叫做 我正在尝试制作一个可重入扫描仪 可以从特定于用户的状态而不是 INITIAL 这是案例 comment start not passed into fl