Flex 换行扫描野牛

2023-12-08

我想使用相同的 flex/bison 扫描仪/解析器作为解释器并加载要解释的文件。在这两种情况下我都无法让换行符解析正常工作。

  1. 解释器:有一个提示,我可以输入按 ENTER 终止的命令。
  2. 文件:这是一个示例输入文件:

- - -切 - - - - -

begin(
    print("well done"), 1)

- - 切 - - - -

因此,第一行和“(”之后应该有一个换行符。

在我的扫描仪中我有

%%
[ \t]                       {   errorLineCol += strlen(yytext); }

\n                          {   errorLineNumber++;
                                errorLineCol = 0; }

("-"?[0-9])[0-9]*           {   errorLineCol += strlen(yytext);
                                yylval = stringToInteger(yytext);
                                return TINTEGER; }

.....

这适用于文件场景,但不适用于解释器。我必须在 ENTER 后按额外的 Ctrl+D。如果我改为

\n                          {   errorLineNumber++;
                                errorLineCol = 0;
                                return 0; }

然后解释器可以工作,但不能读取文件;然后在遇到第一个换行符后停止。有什么好的方法可以解决这个问题呢?

Edit:

这是解析器的顶层:

input: uexpr                        {   parseValue = $1; }
    | /* empty */                   {   parseValue = myNull; }
    | error                         {   parseValue = myNull; }
    ;

uexpr: list                          
    | atom                         
    ;

可能的解决方案:似乎是要使用

\n                          {   errorLineNumber++;
                                errorLineCol = 0;
                                if (yyin == stdin) return 0; }

主要问题是你的解析器函数ypparse直到将整个语言缩减为起始符号后才返回。

如果你的语法的顶层是这样的:

language : commands ;

commands : command commands | /* empty */ ;

当然,机器会期望一个完整的脚本(通过按 Ctrl-D 终止)。如果你的解释器是这样的逻辑:

loop:
  print("prompt>")
  yyparse()
  if (empty statement)
    break

从那以后它就行不通了yyparse返回之前正在消耗整个脚本。

The return 0;解决了此交互模式的问题,因为令牌值 0 表示EOF到解析器,使其认为脚本已经结束。

我不同意制作的解决方案\n一个令牌。它只会使语法复杂化(迄今为止无关紧要的空白现在很重要)并且最终不起作用,因为yyparse函数仍然想要处理完整的语法。也就是说,如果你有换行符作为标记,但语法的开始符号代表整个脚本,yyparse仍然不会返回到交互式提示循环。

一个快速而肮脏的技巧是让词法分析器知道交互模式是否有效。那么就可以有条件地return 0;对于换行符的每个实例(如果处于交互模式)。如果输入不是完整的语句,则会出现语法错误,因为整个脚本以换行符结束。在正常的文件读取模式下,您的词法分析器可以吃掉所有空白而不返回,就像以前允许使用单个处理整个文件一样yyparse.

如果您想要交互式输入和文件读取而不在词法分析器中实现两种行为模式,您可以做的是更改语法,使其仅解析该语言的一个语句:yyparse函数返回您语言的每个顶级语句。 (词法分析器像以前一样吃换行符,不返回 0)。即语法的起始符号只是一个语句(可能是空的)。然后你的文件解析器必须实现为一个循环(由你编写),它调用 yyparse 从文件中获取所有语句,直到yyparse遇到空输入。这种方法的缺点是,如果用户输入不完整的语法(例如悬空的左括号),解析器将继续扫描输入,直到满意为止。这是不友好的,就像使用的程序一样scanf对于交互式用户输入(这是同样的问题:scanf是一个解析器,在满足之前不会返回)。

另一种可能性是有一个交互模式,它执行自己的用户输入,而不是调用 yyparse 来获取输入and解析它。在此模式下,您将用户的输入读入行缓冲区。然后让解析器处理行缓冲区。处理行缓冲区而不是FILE *流是完全可能的。您只需要编写自定义输入处理(您自己的定义YY_INPUT宏)。如果您实现具有行编辑和历史记录的良好交互模式,那么您最终将需要这种方法,例如使用libedit or GNU readline.

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

Flex 换行扫描野牛 的相关文章

  • 向进度条添加百分比文本 C#

    我有一个方法可以显示进程栏何时正在执行以及何时成功完成 我工作得很好 但我想添加一个百分比 如果完成 则显示 100 如果卡在某个地方 则显示更少 我在网上做了一些研究 但我无法适应我正在寻找的解决方案 这是我的代码 private voi
  • 用于代数简化和求解的 C# 库 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 网络上有很多代数求解器和简化器 例如 algebra com 上不错的代数求解器和简化器 然而 我正在
  • 如何在 .NET Framework 2.0 中模拟“Func<(Of <(TResult>)>) 委托”?

    我尝试使用这个类代码项目文章 http www codeproject com KB threads AsyncVar aspx在 VB NET 和 NET Framework 2 0 中 除了这一行之外 所有内容似乎都可以编译Privat
  • Directory.Delete 之后 Directory.Exists 有时返回 true ?

    我有非常奇怪的行为 我有 Directory Delete tempFolder true if Directory Exists tempFolder 有时 Directory Exists 返回 true 为什么 可能是资源管理器打开了
  • 如何在c++中读取pcap文件来获取数据包信息?

    我想用 C 编写一个程序来读取 pcap 文件并获取数据包的信息 例如 len sourc ip flags 等 现在我找到了如下代码 我认为它会帮助我获取信息 但是我有一些疑问 首先我想知道应该将哪个库添加到我的程序中 然后什么是 pca
  • 如何将非静态类成员“std::bind”绑定到 Win32 回调函数“WNDPROC”?

    我正在尝试将非静态类成员绑定到标准WNDPROC http msdn microsoft com en us library ms633573 aspx功能 我知道我可以通过将类成员设为静态来简单地做到这一点 但是 作为一名 C 11 ST
  • 当我们想要返回对象的引用时,为什么我们在赋值运算符中返回 *this 而通常(而不是 this)?

    我正在学习 C 和指针 我以为我理解了指针 直到我看到这个 一方面 asterix 运算符是解引用的 这意味着它返回值所指向的地址中的值 而与号 运算符则相反 它返回值存储的地址记忆 现在阅读有关赋值重载的内 容 它说 我们返回 this因
  • 使用 LINQ2SQL 在 ASP.NET MVC 中的各种模型存储库之间共享数据上下文

    我的应用程序中有 2 个存储库 每个存储库都有自己的数据上下文对象 最终结果是我尝试将从一个存储库检索到的对象附加到从另一个存储库检索到的对象 这会导致异常 Use 构造函数注入将 DataContext 注入每个存储库 public cl
  • 复制目录内容

    我想将目录 tmp1 的内容复制到另一个目录 tmp2 tmp1 可能包含文件和其他目录 我想使用C C 复制tmp1的内容 包括模式 如果 tmp1 包含目录树 我想递归复制它们 最简单的解决方案是什么 我找到了一个解决方案来打开目录并读
  • 使用 Newtonsoft 和 C# 反序列化嵌套 JSON

    我正在尝试解析来自 Rest API 的 Json 响应 我可以获得很好的响应并创建了一些类模型 我正在使用 Newtonsoft 的 Json Net 我的响应中不断收到空值 并且不确定我的模型设置是否正确或缺少某些内容 例如 我想要获取
  • 如何区分用户点击链接和页面自动重定向?

    拥有 C WebBrowser control http msdn microsoft com en us library system windows forms webbrowser aspx在我的 WinForms 应用程序中 并意识
  • 为什么 Google 测试会出现段错误?

    我是 Google Test 的新手 正在尝试提供的示例 我的问题是 当我引入失败并设置GTEST BREAK ON FAILURE 1 或使用命令行选项 GTest 将出现段错误 我正在考虑这个例子 https code google c
  • 使用接口有什么好处?

    使用接口有什么用 我听说它用来代替多重继承 并且还可以用它来完成数据隐藏 还有其他优点吗 哪些地方使用了接口 程序员如何识别需要该接口 有什么区别explicit interface implementation and implicit
  • 在 C 中初始化变量

    我知道有时如果你不初始化int 如果打印整数 您将得到一个随机数 但将所有内容初始化为零似乎有点愚蠢 我问这个问题是因为我正在评论我的 C 项目 而且我对缩进非常直接 并且它可以完全编译 90 90 谢谢 Stackoverflow 但我想
  • 为什么调用非 const 成员函数而不是 const 成员函数?

    为了我的目的 我尝试包装一些类似于 Qt 共享数据指针的东西 经过测试 我发现当应该调用 const 函数时 会选择它的非 const 版本 我正在使用 C 0x 选项进行编译 这是一个最小的代码 struct Data int x con
  • 是否有实用的理由使用“if (0 == p)”而不是“if (!p)”?

    我倾向于使用逻辑非运算符来编写 if 语句 if p some code 我周围的一些人倾向于使用显式比较 因此代码如下所示 if FOO p some code 其中 FOO 是其中之一false FALSE 0 0 0 NULL etc
  • 标准化 UTF-8 到底是什么?

    The 重症监护室项目 http userguide icu project org transforms normalization 现在也有一个PHP库 http us php net manual en class normalize
  • 使用管道时,如果子进程数量大于处理器数量,进程是否会被阻塞?

    当子进程数量很大时 我的程序停止运行 我不知道问题是什么 但我猜子进程在运行时以某种方式被阻止 下面是该程序的主要工作流程 void function int process num int i initial variables for
  • 如何设置 log4net 每天将我的文件记录到不同的文件夹中?

    我想将每天的所有日志保存在名为 YYYYMMdd 的文件夹中 log4net 应该根据系统日期时间处理创建新文件夹 我如何设置它 我想将一天中的所有日志保存到 n 个 1MB 的文件中 我不想重写旧文件 但想真正拥有一天中的所有日志 我该如
  • 无法接收 UDP Windows RT

    我正在为 Windows 8 RT 编写一个 Windows Store Metro Modern RT 应用程序 需要在端口 49030 上接收 UDP 数据包 但我似乎无法接收任何数据包 我已按照使用教程进行操作DatagramSock

随机推荐

  • Keras 如何处理多标签分类?

    我不确定如何解释 Keras 在以下情况下的默认行为 我的 Y 基本事实 是使用 scikit learn 设置的MultilabelBinarizer 因此 举一个随机的例子 我的一排y列是 one hot 编码的 如下所示 0 0 0
  • 显示所有文件的键盘快捷键

    有没有人在解决方案资源管理器中找到 显示所有文件 的键盘快捷键 还有一个相关的问题 是否有任何工具可以显示您在 VS 中执行的任何操作的键盘快捷键 Cheers SteveC 默认情况下没有 但 转到工具 选项 环境 键盘 在 显示包含的命
  • ICommand方法执行参数值

    我尝试理解 wpf 中的 ICommand 在我的 Event 类中 我实现了 ICommand 及其方法 一种方法是执行 public void Execute object parameter Do something 现在是我的问题
  • Office 365 REST API 可以发送包含纯文本和 HTML 正文的电子邮件吗?

    我正在查看 API 文档 看起来您只能指定一个Body in a Message 发送消息 https msdn microsoft com en us office office365 api mail rest operations S
  • 对象实例可以安全地清空指向自身的“this”指针吗?

    Class A public NullIt this NULL Foo NullIt A a new A a gt Foo assert a should assert here 除了内存泄漏之外 有没有办法达到这种效果 您到底想达到什么效
  • 使用接口引用访问 java Object 类方法

    让我们考虑以下示例 public interface SimpleInterface public void simpleMethod public class SimpleClass implements SimpleInterface
  • Envoy 的 Jwt 验证失败

    我有一个 Laravel Lumen 登录 API 它使用 HS256 生成 JWT 然后我将不记名令牌发送到 Envoy Gateway 并从 Envoy 获取 JWT验证失败 在官方 JWT 解码网站上 我可以成功解码并验证我的不记名令
  • jquery 手风琴防止冒泡/允许默认链接操作

    我有一个手风琴设置如下 shortheadline accordion active false header headline autoHeight false animated slowslide changestart functio
  • 如何使用set来改变shell变量?

    我正在使用 GNU bash 版本 4 3 11 1 release x86 64 pc linux gnu set grep SHELL SHELL bin bash SHELLOPTS braceexpand emacs hashall
  • 检查一个日期是否落在日期范围-Linq 查询之间

    我正在数据库中存储员工的休假信息 从和到日期将存储在数据库中 我想阻止员工在已申请的休假范围内申请休假 例如 假设一名员工已在 01 01 2015 至 05 01 2015 之间申请休假 i if user again try to ap
  • 验证 JSF 中的小数输入

    我想将输入验证为整数 因此 任何带有小数的值都应该被过滤 但我不知道如何实现这一目标 我已经尝试了很多方法 但是使用下面的代码 如果输入是 61 2 则该值将转换为61 只是截断小数部分 但我想强制验证错误 我确信我可以在没有自定义验证器的
  • 不兼容的数据透视类型 SQL

    我已经获得了一个数据库 我需要执行PIVOT在 我的枢轴工作得很好 但是 我需要在 SELECT 中执行的列之一是text类型 但是 PIVOT 命令不能使用此数据类型 我该如何解决这个问题 我个人的偏好是将列类型转换为VARCHAR MA
  • BeautifulSoup 的 Python 内存问题

    我已经解决了这个问题 但我想知道为什么会导致这个问题 我使用 BeautifulSoup 从网页中识别出这个跨度 span span Ally s Sizzlers span 然后我分配这个变量 restaurant name span c
  • 按每个子列表的第一个元素对列表列表进行排序[重复]

    这个问题在这里已经有答案了 如何根据每个列表的第一个元素对列表列表进行排序 例如 给出这个未排序的列表 1 4 7 3 6 9 2 59 8 排序后的结果应该是 1 4 7 2 59 8 3 6 9 使用排序函数并将匿名函数作为值传递给键参
  • XML 文件作为 django 项目的模型

    我有一个由其他程序管理的 XML 文件 我正在编写一个 Web 服务 以便用户能够查询该文件 本质上 我使用基于 xml 的数据库 而不是使用 sql 作为 Django 中的模型数据库 我该怎么做呢 我发现的所有教程都在后端使用 SQL
  • ASP.NET“特殊”标签

    像这样的 特殊 ASP NET 标记的官方名称是什么 我似乎无法弄清楚这些的概念或众所周知的名称 所以我在搜索更多信息时遇到了困难 作为奖励 任何人都可以给我一个所有可能的 特殊标签 的快速概要以及它们每个标签的作用 或向我指出一种资源 正
  • 如何将自定义 JAR 添加到“eclipse-pmd”插件?

    安装了Eclipse PMD 插件 由菲利普 格拉夫 from here 我尝试关联自定义 PMD 规则类 JAR 但找不到它的规定 该 JAR 包含自定义规则类 即extends AbstractJavaRule间接 那么有什么办法可以配
  • Windows VC++ 获取机器型号名称

    谁能告诉我如何获取 Windows 机器的型号名称 我是 Windows VC 的新手 例如 我有一台在 Windows 上运行的 IBM ThinkCenter M50 这里的型号名称是 Think Center M50 我想使用一些 A
  • Visual Studio 代码自动导入

    我正在从 Webstorm 迁移到 Visual Studio Code Webstorm 的性能很糟糕 Visual Studio 代码对于查找我需要的依赖项并导入它们并不是很有帮助 到目前为止 我一直在手动执行此操作 但说实话 我宁愿等
  • Flex 换行扫描野牛

    我想使用相同的 flex bison 扫描仪 解析器作为解释器并加载要解释的文件 在这两种情况下我都无法让换行符解析正常工作 解释器 有一个提示 我可以输入按 ENTER 终止的命令 文件 这是一个示例输入文件 切 begin print