使用 Flex 编写可重入词法分析器

2023-11-27

我是弯曲的新手。我正在尝试使用 Flex 编写一个简单的可重入词法分析器/扫描器。词法分析器定义如下。我遇到编译错误,如下所示(yyg 问题):

可重入.l:

/* Definitions */

digit           [0-9]
letter          [a-zA-Z]
alphanum        [a-zA-Z0-9]
identifier      [a-zA-Z_][a-zA-Z0-9_]+
integer         [0-9]+
natural         [0-9]*[1-9][0-9]*
decimal         ([0-9]+\.|\.[0-9]+|[0-9]+\.[0-9]+)

%{
    #include <stdio.h>

    #define ECHO fwrite(yytext, yyleng, 1, yyout)

    int totalNums = 0;
%}

%option reentrant
%option prefix="simpleit_"

%%

^(.*)\r?\n     printf("%d\t%s", yylineno++, yytext);

%%
/* Routines */

int yywrap(yyscan_t yyscanner)
{
    return 1;
}

int main(int argc, char* argv[])
{
    yyscan_t yyscanner;

    if(argc < 2) {
        printf("Usage: %s fileName\n", argv[0]);
        return -1;
    }

    yyin = fopen(argv[1], "rb");

    yylex(yyscanner);

    return 0;
}

编译错误:

vietlq@mylappie:~/Desktop/parsers/reentrant$ gcc lex.simpleit_.c 
reentrant.l: In function ‘main’:
reentrant.l:44: error: ‘yyg’ undeclared (first use in this function)
reentrant.l:44: error: (Each undeclared identifier is reported only once
reentrant.l:44: error: for each function it appears in.)

对于可重入词法分析器,所有通信必须包括state,它包含在scanner.

程序中的任何位置(e.g. inside main)您可以通过将扫描仪传递给的特殊函数来访问状态变量。E.g.,在你原来的reentrant.l, 你可以这样做:

yyscan_t scanner;
yylex_init(&scanner);
yyset_in(fopen(argv[1], "rb"), scanner);
yylex(scanner);
yylex_destroy(scanner);

我已重命名scanner以避免混淆yyscanner在行动中。与一般的 C 代码相比,您的所有操作都发生在一个名为的巨大函数中yylex,它通过名称传递给您的扫描仪yyscanner. Thus, yyscanner适用于您的所有操作。此外,yylex有一个名为的局部变量yyg保存整个状态,大多数宏方便地引用yyg.

虽然您确实可以使用yyin宏内main通过定义yyg正如您在自己的答案中所做的那样,不建议这样做。对于可重入词法分析器,宏仅用于操作。

要了解这是如何实现的,您可以随时查看生成的代码:


/* For convenience, these vars
   are macros in the reentrant scanner. */
#define yyin yyg->yyin_r
...

/* Holds the entire state of the reentrant scanner. */
struct yyguts_t
...

#define YY_DECL int yylex (yyscan_t yyscanner)

/** The main scanner function which does all the work.
 */
YY_DECL
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
...
}

还有很多关于reentrant选项中的flex文档,其中包括一个干净的编译示例。 (谷歌 ”弯曲可重入”,并寻找flex.sourceforge链接。)不同于bison, flex有一个相当简单的可重入模型。我强烈建议使用可重入flex with Lemon Parser,而不是与yacc/野牛.

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

使用 Flex 编写可重入词法分析器 的相关文章

  • 线程忙等待

    基本上 我需要忙着等待一些 html 出现在网页上 我创建了以下代码来忙等我 public void ExecuteBusyWaitThreads foreach Canidate canidate in allCanidates Thre
  • C# 锁定传递给方法的引用 - 不好的做法?

    我有一个类似的方法 public static void DoSomething string param1 string param2 SomeObject o lock o o Things Add param1 o Update et
  • PyGTK:带线程的 gobject.idle_add() 和 timeout_add()

    是否有任何明确的文档说明idle add timeout add 和 或它们安装的实际回调是否需要锁 任何类型 def work args 1 gtk gdk threads enter needed self ui change some
  • HttpContext 类及其线程安全

    我有一个辛格尔顿应用程序中的对象具有以下属性 private AllocationActionsCollection AllocationActions get return HttpContext Current Session Allo
  • Stopwatch.ElapsedTicks 线程安全吗?

    如果我有一个共享的System Diagnostics Stopwatch实例 可以多线程调用shared ElapsedTicks以安全的方式并获得准确的结果 以这种方式使用 Stopwatch 的共享实例与使用静态GetTimeStam
  • 两个具有共享缓冲区的等待线程(生产者/消费者)

    我试图让一堆生产者线程等待 直到缓冲区有空间容纳某个项目 然后将项目放入缓冲区 如果没有更多空间 则返回睡眠状态 同时应该有一堆消费者线程等待 直到缓冲区中有东西 然后尽可能地从缓冲区中获取东西 如果缓冲区为空则返回睡眠状态 在伪代码中 这
  • 线程安全框架

    以下类不是线程安全的 如证明以下代码不是线程安全的 https stackoverflow com questions 2410499 proving the following code not thread safe 是否有一个框架可以
  • 单线程公寓问题

    从我的主窗体中 我调用以下命令来打开一个新窗体 MyForm sth new MyForm sth show 一切都很好 但是这个表单有一个组合框 当我将其 AutoCompleteMode 切换为建议和追加时 我在显示表单时遇到了这个异常
  • 为什么像 BindingList 或 ObservableCollection 这样的类不是线程安全的?

    我一次又一次发现自己必须编写 BindingList 和 ObservableCollection 的线程安全版本 因为当绑定到 UI 时 这些控件无法从多个线程更改 我想理解的是why情况就是这样 这是设计错误还是故意的 问题是设计一个线
  • 这是 C# 的有效、惰性、线程安全的 Singleton 实现吗?

    我实现了这样的单例模式 public sealed class MyClass public static MyClass Instance get return SingletonHolder instance static class
  • 为什么不推荐基于 AtomicInteger 的 Stream 解决方案?

    假设我有以下水果清单 List
  • PHP Intl 扩展线程安全吗?

    我一直在阅读有关 PHP 中的语言环境的内容 看起来setlocale 线程有问题 我对线程不太熟悉 文档提到它不是线程安全的 我想让我的项目能够处理某些数字格式 并且 Intl 扩展似乎很有趣 http php net manual en
  • 如何使用Python多处理创建同步对象?

    我无法弄清楚如何创建同步的 Python 对象 我有一个名为 Observation 的类和一个名为 Variable 的类 基本上看起来像这样 代码被简化以显示本质 class Observation def init self date
  • Python3.0 - 标记化和取消标记化

    我正在使用类似于以下简化脚本的内容来解析较大文件中的 python 片段 import io import tokenize src foo bar src bytes src encode src io BytesIO src src l
  • 在后台线程上搜索

    我试图在 iPhone 应用程序中搜索数千个对象 但是搜索严重滞后 每次击键后 UI 都会冻结 1 2 秒 为了防止这种情况 我必须在后台线程上执行搜索 我想知道是否有人有一些在后台线程上搜索的提示 我读了一点NSOperation并在网上
  • 如何使用 LOCK ASM 前缀来读取值?

    我知道如何使用 LOCK 来线程安全地递增一个值 lock inc J 但是如何以线程安全的方式读取 J 或任何值 LOCK 前缀不能与 mov 一起使用 如果我执行以下操作 xor eax eax lock add eax J mov J
  • JavaFX:如何在 JavaFX 中正确使用 ProgressIndicator

    我是 JavaFX 新手 我的 JavaFX 应用程序有问题 我需要在数据库查询之前启动 ProgressIndicator 类型 INDETERMINATE 这是我的代码的一部分 spinner setVisible true passC
  • boto 库是线程安全的吗?

    具体来说 我对从多个线程 放置 获取 更新等 使用 DynamoDB 表对象感兴趣 如果这不安全 那么是否有一种安全的方法 即每个线程可能有一个表对象 关于在 boto 中使用线程的任何其他陷阱或技巧表示赞赏 boto 库使用 httpli
  • Python内置容器是线程安全的吗?

    我想知道Python内置容器 列表 向量 集合 是否是线程安全的 或者我是否需要为我的共享变量实现锁定 解锁环境 您需要为将在 Python 中修改的所有共享变量实现自己的锁定 您不必担心从不会被修改的变量中读取 即并发读取是可以的 因此不
  • 无法访问类型的封闭实例。 [复制]

    这个问题在这里已经有答案了 整个代码是 public class ThreadLocalTest ThreadLocal

随机推荐

  • .NET 中非矩形形式的平滑边缘

    我使用 Form Region 创建了一个带有圆角的表单 它有效 但不幸的是四舍五入看起来很粗糙 有什么技巧可以平滑这种形状的角吗 我知道很多应用程序都支持这一点 只是不确定如何在 NET 中实现它 多谢你们 对此没有好的解决办法 区域无法
  • gcloud app 部署错误:获取应用程序 [apps/] 时出现权限错误

    我通过发出以下命令来部署一个简单的 Python 3 App Engine 应用程序 Flexi 环境 gcloud app deploy version ver0 1 并出现以下错误 ERROR gcloud app deploy Per
  • 更改 JOptionPane 中的确定取消字符串

    我想知道是否可以将 确定取消 按钮更改为java中的自定义字符串 我有 JOptionPane showConfirmDialog message title JOptionPane OK CANCEL OPTION 现在 按钮将显示 确定
  • 修改节点进程环境或参数运行时

    是否可以修改process 例如process argv push something 似乎其他模块没有接收参数中的更改 我想 欺骗 另一个模块 使其表现得像进程启动时指定了某个参数一样 进程是否为加载时的每个模块进行实例化 因此全局不可变
  • 在 React Native 中从本地 json 文件导入文本

    我想知道常见的方法是将巨大的文本导入视图 就我而言 我正在为 Android 和 iOS 开发一个 React Native 应用程序 并且在我的视图之一上我想展示 使用条款 文档 现在 当我只是将其导入 复制粘贴到文本组件中时 它就不是正
  • IE7 中 100% 宽度的文本区域忽略父元素的宽度

    我有以下内容textarea in a table table width 300 tr td td tr table
  • 解释 VS 描述 mysql 中的异常

    MySQL 中的 EXPLAIN 和 DESC 命令有什么区别 Explain会给你更多 有关查询的信息 describe会给你更多 有关表或列的信息 您还可以对表名使用 EXPLAIN 在这种情况下 它的行为与 DESCRIBE 完全相同
  • 如何使用 Javascript 延迟提交表单

    我正在尝试在我正在编写的 chrome 扩展中延迟自动提交表单 但它似乎没有提交 下面是我的表单和 javascript function submitForm submits form document getElementById is
  • 完整 .Net 中的实体框架核心?

    有没有办法在完整的 Net Framework 控制台应用程序中实现 Entity Framework Core 首先 您需要创建具有完整 net 框架的控制台应用程序 其次使用包管理器控制台安装这些包 Install Package Mi
  • 将 RDD[org.apache.spark.sql.Row] 转换为 RDD[org.apache.spark.mllib.linalg.Vector]

    我对 Spark 和 Scala 比较陌生 我从以下数据框开始 由密集的双精度向量组成的单列 scala gt val scaledDataOnly pruned scaledDataOnly select features scaledD
  • 为什么我们需要 IEEE 754 余数?

    我刚刚读过这个话题 尤其是最后的评论 然后我想知道 为什么我们真正需要这个是为了给剩下的 但似乎之前没有多少人 在谷歌上 对此感兴趣 如果您正在寻找想要它的原因 其中之一就是所谓的 范围缩小 假设你想要sind用于计算参数正弦值 以度为单位
  • Azure 上的 Django 应用程序未获取静态文件

    在 Azure Web 应用程序上获取了我的 Django 项目 但是当我在 SSH 终端上调用时 Python 管理 py 收集静态 它说复制了 252 个文件 但我的静态文件在我的模板上不可见 并且 wwwroot 中的静态文件夹是空的
  • 删除所有文件和文件夹但排除子文件夹

    我有一个文件夹 需要删除除一小部分文件和文件夹之外的所有文件和文件夹 我已经可以排除文件列表 但没有找到排除文件夹及其内容的方法 这是文件夹结构 C temp C temp somefile txt C temp someotherfile
  • 在字符串内包含引号?

    我正在尝试将引号包含在字符串中以添加到文本框 我正在使用此代码 t AppendText Dim Choice count As String Your New Name is pt1 pt2 vbNewLine 但它不起作用 我希望它像这
  • 从大型数据集中随机采样

    我从一个大型数据库中提取了研究人群 为了进行比较 我想选择一个具有相似特征的对照组 我想要匹配的两个标准是年龄和性别 为我提供用于匹配目的的数字的查询是 select sex age 10 as decades COUNT as count
  • URL/子域重写 (htaccess)

    假设我有以下文件 http www example com images folder image jpg 我想把它放在 http s1 example com folder image jpg 我如何进行 htaccess 重写以将其指向
  • GAE交易失败和幂等性

    Google App Engine 文档包含以下段落 注意 如果您的应用程序在提交时收到异常 交易失败并不总是意味着交易失败 你 可以接收DatastoreTimeoutException ConcurrentModificationExc
  • Linq2SQL 处理具有唯一约束的表上的插入/删除

    我有一个如下所示的表 TABLE Foo Guid Id PK int A FK int B FK int C FK 以及对 A B 和 C 的唯一约束 现在举例来说 您插入带有新 PK 的行 其中 A 1 B 1 C 1 SubmitCh
  • 在单个谱系中变基多个分支的最简单方法

    我有两个分支位于上游 主控之上 一个分支以另一个为祖先 因此它们形成一条线 U1 upstream master A B fixes C D features 随后 upstream master 继续前进 U1 U2 upstream m
  • 使用 Flex 编写可重入词法分析器

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