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 可重入以用户特定状态启动 的相关文章

  • 为什么这个野牛代码会产生意外的输出?

    弹性代码 1 option noyywrap nodefault yylineno case insensitive 2 3 include stdio h 4 include tp tab h 5 6 7 8 return 9 retur
  • 解析类 C 定义字符串的最有效方法?

    我有一组用类 C 语言编写的函数定义 其中包含一些附加关键字 这些关键字可以放在某些参数之前 例如与 无符号 或 寄存器 相同的方式 我需要分析这些行以及一些函数存根并从中生成实际的 C 代码 Flex Yacc 是最正确的方法吗 如果我对
  • 使用 Flex 编写可重入词法分析器

    我是弯曲的新手 我正在尝试使用 Flex 编写一个简单的可重入词法分析器 扫描器 词法分析器定义如下 我遇到编译错误 如下所示 yyg 问题 可重入 l Definitions digit 0 9 letter a zA Z alphanu
  • 如何处理flex中的嵌套注释

    我正在为支持嵌套注释的语言编写一个 Flex 扫描器 如下所示 我曾经在支持递归调用 lex 扫描器的 ocaml ocamllex 上工作 非常优雅 但我现在切换到c flex 如何处理这样的嵌套注释 假设只有注释可以嵌套在注释中 那么对
  • 如何制作一个flex(词法扫描器)来读取UTF-8字符输入?

    看起来flex不支持UTF 8输入 每当扫描器遇到非 ASCII 字符时 它就会停止扫描 就像它是 EOF 一样 有没有办法强制 Flex 吃掉我的 UTF 8 字符 我不希望它实际匹配 UTF 8 字符 只需在使用 时吃掉它们即可图案 有
  • Flex 换行扫描野牛

    我想使用相同的 flex bison 扫描仪 解析器作为解释器并加载要解释的文件 在这两种情况下我都无法让换行符解析正常工作 解释器 有一个提示 我可以输入按 ENTER 终止的命令 文件 这是一个示例输入文件 切 begin print
  • main 需要一个文件名作为第一个参数...但我也可以通过管道提供 main 文件...这是如何工作的?

    我有一个带有 main 函数的 C 程序 int main int argc char argv FILE f fopen argv 1 r 请注意 在执行程序时 它期望提供一个文件名作为第一个参数 例如 main test dat 当我这
  • YAML 解析 - lex 还是手工?

    我正在尝试编写一个简单的 YAML 解析器 我从 yaml org 阅读了规范 在开始之前 我想知道是否编写一个手卷解析器更好 或者 使用lex flex bison 我看了看libyaml C 库 好像没用lex yacc YAML 不包
  • 在 Bison 中为 && 和 || 启动短路规则运营

    我正在使用 C C 在 Bison 和 Flex 中编写一个简单的计算器 逻辑在 Bison 中完成 C C 部分负责数据结构 例如 STL 等 我有以下问题 在我的计算器中美元符号 表示 i 和 i 前缀和后缀 例如 int y 3 gt
  • 是否可以设置规则的优先级以避免“最长最早”的匹配模式?

    另一个简单的问题 有没有办法告诉 flex 更喜欢匹配短事物的规则而不是匹配长事物的规则 我找不到任何关于这方面的好的文档 这就是我需要它的原因 我解析一个伪语言文件 其中包含一些与控制指令相对应的关键字 我希望它们成为绝对优先级 这样它们
  • 如何在 Visual Studio 2005/2008 中编译 Flex?

    我无法弄清楚这一点 我可以从 gnuwin32 下载 flex 2 5 4a 的 win32 二进制文件 但我想使用 Visual Studio 2005 构建最新版本 2 5 35 我想我可以在 cygwin 中构建 但其中的乐趣在哪里
  • 我的 Flex 文件输出错误

    我编写了一个 l 文件并希望输出 c17 isc 中的内容 但有一个错误我不知道为什么 我已经给出了我打算读取的文件 flex文件和执行结果 这是 c17 isc 文件 内容的意思是 number gate name gate type o
  • Flex/Bison 错误:请求非结构或联合中的成员“str”

    我正在学习 flex bison 我编写了以下程序但出现错误 include
  • Flex/Lex 和 Yacc/Bison 有什么区别?

    Flex Lex 和 Yacc Bison 之间有什么区别 我在网上疯狂搜索 没有找到任何可靠的答案 我可以在 Ubuntu 上安装纯 Lex 和 Yacc 还是可以只安装 flex 和 bison 我很困惑 Lex 或 Yacc 是否仍然
  • yytext[0]是什么意思?

    yytext 0 是什么意思 为什么我们要在 lex 和 yacc 程序中使用 我是学习者 所以不要介意这是一个愚蠢的问题 yytext 保存与当前标记匹配的文本 因此 yytext 0 保存与当前标记匹配的文本的第一个字符 有时您有一个可
  • GNU Flex 库 libfl 提供什么?

    我可以从 flex 和 bison 生成的文件编译一个程序 cc lex yy c program tab c o output 也由 cc lex yy c program tab c lfl o output 它们都运行顺利 没有任何问
  • 对 yyparse 的未定义引用(flex 和 bison)

    我正在尝试学习一些 Flex Bison 并且正在阅读 John Levine O Reilly 的 Flex Bison 有一个我需要运行的示例 但是我无法运行它 因为出现以下错误 tmp ccKZcRYB o In function y
  • flex 中 yywrap() 的含义

    该指令在 flex lex 中意味着什么 define yywrap 1 和这个 t 我在下面的代码中找到它 t putchar t 输入 你好世界 输出 你好世界 根据Lex 和 Yacc 页面 http dinosaur compile
  • 在 Mac OS X 10.6 上编译和执行莎士比亚编程语言转换器 spl2c 会导致警告/错误

    我想尝试一下莎士比亚编程语言 http shakespearelang sourceforge net report shakespeare 所以我从here http shakespearelang sourceforge net 并使用
  • 对“yylex()”的未定义引用

    我正在尝试使用 flex 和 bison 创建一种简单的脚本语言 现在 我只是想让计算器工作 但我无法编译它 当我运行这个 makefile 时 OBJECTS hug tab o hug yy o PROGRAM hug exe CPP

随机推荐

  • 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