如何在 yacc 中将 yylval 与字符串一起使用

2023-11-26

我想传递令牌的实际字符串。如果我有一个名为 ID 的令牌,那么我希望我的 yacc 文件真正知道 ID 的名称。我想我必须使用 yylval 将字符串从 Flex 文件传递​​到 yacc 文件。我怎么做?


通过 yylval 返回字符串或任何复杂类型的关键是 yacc 在 y.tab.h 文件中创建的 YYSTYPE 联合。 YYSTYPE 是一个联合,其中包含 yacc 源文件中定义的每种标记类型的成员。例如,要返回与 yacc 源文件中的 SYMBOL 标记关联的字符串,您可以使用以下命令声明此 YYSTYPE 联合%union在 yacc 源文件中:

/*** Yacc's YYSTYPE Union ***/

/* The yacc parser maintains a stack (array) of token values while
   it is parsing.  This union defines all the possible values tokens
   may have.  Yacc creates a typedef of YYSTYPE for this union. All
   token types (see %type declarations below) are taken from
   the field names of this union.  The global variable yylval which lex
   uses to return token values is declared as a YYSTYPE union.
 */

    %union {
        long int4;              /* Constant integer value */
        float fp;               /* Constant floating point value */
        char *str;              /* Ptr to constant string (strings are malloc'd) */
        exprT expr;             /* Expression -  constant or address */
        operatorT *operatorP;   /* Pointer to run-time expression operator */
    };

%type <str> SYMBOL

然后,在 LEX 源文件中存在与 SYMBOL 标记相匹配的模式。与该规则关联的代码负责返回表示 SYMBOL 的实际字符串。您不能只传递指向 yytext 缓冲区的指针,因为它是一个静态缓冲区,可以为每个匹配的标记重用。要返回匹配的文本,必须使用 _strdup() 在堆上复制静态 yytext 缓冲区,并通过 yyval.str 传递指向该字符串的指针。然后,yacc 规则与 SYMBOL 令牌的责任相匹配,以在使用完毕后释放堆分配的字符串。

[A-Za-z_][A-Za-z0-9_]*  {{
    int i;

    /*
    * condition letter followed by zero or more letters
    * digits or underscores
    *      Convert matched text to uppercase
    *      Search keyword table
    *      if found
    *          return <keyword>
    *      endif
    * 
    *      set lexical value string to matched text
    *      return <SYMBOL>
    */

    /*** KEYWORDS and SYMBOLS ***/
    /* Here we match a keywords or SYMBOL as a letter
    * followed by zero or more letters, digits or 
    * underscores.
    */

    /* Convert the matched input text to uppercase */
    _strupr(yytext);         /* Convert to uppercase */

    /* First we search the keyword table */
    for (i = 0; i<NITEMS(keytable); i++) {
        if (strcmp(keytable[i].name, yytext)==0)
            return (keytable[i].token);
    }

    /* Return a SYMBOL since we did not match a keyword */
    yylval.str=_strdup(yytext);
    return (SYMBOL);
}}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 yacc 中将 yylval 与字符串一起使用 的相关文章

  • Lex 正则表达式获得一些额外的字符

    我的 lex 文件中有以下定义 L a zA Z A a zA Z 0 9 L A yylval id yytext return IDENTIFIER 我在 YACC 文件中执行以下操作 primary expression IDENTI
  • yyerror 的 Bison 冲突类型

    我试图用 flex 和 bison 制作一个计算器 但在编译过程中发现了一个错误 这是错误 C GnuWin32 src gt gcc lex yy c y tab c o tugas tugas y 51 error conflictin
  • bison/flex 中的简单 XML 解析器

    我想创建简单的 xml 解析器使用野牛 弯曲 我不需要验证 评论 争论 只需要
  • 需要帮助确定“默认操作类型冲突”的原因

    我一直在做一项学校作业 但很难弄清楚哪个问题导致了 默认操作类型冲突 下面的多个警告 任何帮助将不胜感激 收到的警告 parser y 62 9 23 warning type clash on default action
  • 解决 yacc/ocamlyacc 中的减少/减少冲突

    我正在尝试解析 ocamlyacc 中的语法 与常规 yacc 几乎相同 它支持没有运算符的函数应用程序 如 Ocaml 或 Haskell 中 以及二元和一元运算符的正常分类 我遇到了与 运算符的归约 归约冲突 该运算符可用于减法和求反
  • 安装 Bison 后出现“make: yacc: Command not found”

    在 gcc 4 1 2 linux 5 中运行 makefile 时 出现以下错误 make yacc Command not found 通过谷歌搜索 我了解到可以通过安装 Bison GNU 解析器生成器来纠正此错误 但即使安装了 Bi
  • 为什么 %prec 在此 bison 语法中不起作用?

    考虑以下 Bison 语法 这是从我正在研究的一个更大的语法中剥离出来的 token ident left left CALLPREC start add expr ident call add call expr prec CALLPRE
  • ANTLR 4 令牌规则匹配任何字符,直到遇到 XYZ

    我想要一个标记规则 它会吞噬所有字符 直到它到达字符XYZ 因此 如果输入是这样的 helloXYZ 那么令牌规则应该返回这个令牌 hello 如果输入是这样的 Blah Blah XYZ 那么令牌规则应该返回这个令牌 Blah Blah
  • 编译器构建的语义分析阶段有哪些工具?

    编译器构建可以分为词法分析 语法分析 语义分析等几个阶段 词法分析有Lex Flex等工具 语法分析有Yacc Bison等工具 我只是好奇语义分析阶段有哪些可用的工具 据我所知 没有与语言无关的工具来执行类型检查 如果有的话 它们肯定不会
  • 编写编译器……什么是对的,什么是错的? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 使用 qt:如何在控制台应用程序之上构建 GUI?

    我有一个从 bison 解析器 生成的控制台应用程序 我想为其构建一个简单的 GUI 这样我就可以将此 gui 的输入发送到控制台 并将控制台的输出获取到 gui 中 我尝试使用 java process 类来做到这一点 但它对我不起作用
  • 使用 Flex 和 Bison 的简单 Java 语法

    我最近开始学习基本的 Flex 和 Bison 因为我必须为简单 但不是太简单 语法制作一个解析器 我决定在我的语法中制作一种简化的 Java 语言 我做了 l和 y文件和所有内容都编译没有错误 我正在使用 gcc 进行编译 问题是每次我运
  • 使用 Flex 和 Bison 编译时未定义对“_yyerror”的引用

    我正在尝试为迷你 Pascal 语言制作一个编译器 我为此使用了 Flex 和 Bison 并且出现了这个错误 我的 Flex 文件 include y tab h include
  • PLY - 返回多个令牌

    AFAIK 词法 Python 源代码的技术是 当当前行的缩进级别小于前一行的缩进级别时 产生 DEDENT 如果要关闭多个 INDENT 则生成多个 DEDENT 当到达输入末尾时 如果存在未闭合的 INDENT 则生成 DEDENT 现
  • 跟踪编译器中 AST 节点的源位置 (ocaml)

    我正在使用 ocamllex yacc 在 ocaml 中编写编译器 一切进展顺利 但我遇到了设计问题 对于我创建的每个 AST 节点 最好能获得有关源代码中该节点的行 字符位置的信息 这对于稍后向用户提供错误消息很有用 现在 我可以向我的
  • Flex/Bison IDE? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个良好的开发环境 可以在 Flex 或 Bison 或两者上工作 是否有任何 IDE 具有
  • 如何提高词法分析效率?

    在解析一个 3 GB 的大文件时DCG https www metalevel at prolog dcg 效率很重要 我的词法分析器的当前版本主要使用 or 谓词 2 http www swi prolog org pldoc doc f
  • Flex 和 Bison 彼此需要什么?

    当 Flex 和 Bison 一起使用时 为什么 Flex 文件需要 includebison 创建的 C 头文件 编译需要 bison 和 flex 创建的 C 源文件 bison 和 flex 创建的 C 源文件相互需要什么 bison
  • 构建 gcc 4.6 时遇到问题:对“yylex”的未定义引用

    我正在尝试构建 gcc 4 6 但我收到一些链接器错误 看起来这意味着 bison 或 flex 没有链接到 当 makefile 发出此命令时 gcc g fkeep inline functions DIN GCC W Wall Wwr
  • 如何将 C++ flex 与 C++ Bison 连接起来?

    我正在尝试将 C flex 与 C bison 连接起来 但我被难住了 Bison 3 8 1 手册有一个带有 C Flex 的 C Bison 示例 Flex 2 6 4 没有示例 我试图解决的问题是如何向 C 或 C Bison 提供指

随机推荐

  • 如何实现任何可变性的特征?

    可变性可以成为特征中的通用参数吗 我想实现类型的可变和不可变变体的特征 而不必复制和粘贴impl block trait Foo
  • 如何在 json 数据文件更改时刷新页面

    所以我有一个名为 data json 的本地文件 其中包含各种数据 我只想在 json 文件中的某些数据发生更改时刷新页面 如果您能用一些代码来解释我 我将感谢您的帮助 我在互联网上搜索 找不到合适的答案 创建一个计时器 每 X 毫秒获取
  • 如何隐藏或删除 jQuery 选择下拉列表中的选项

    我想隐藏使用 选择 插件创建的下拉列表中的某些元素 我尝试删除它 option contains Swatch 1 remove trigger chosen updated 并隐藏它 chosen results li contains
  • 如何将字典列表转换为两个列表?

    例如 persons id 1 name john id 2 name mary id 3 name tom 我想从中得到两个列表 ids 1 2 3 names john mary tom 我做了什么 names d name for d
  • Scala Play 2,将请求传递给方法

    我有一个Play 2 0 app TestController scala def foo p1 String Action implicit request gt Ok bar p1 private def bar p1 String a
  • JVM 在 libzip.so 处崩溃

    我的 JVM 总是在 libzip so 处连续意外地崩溃 我已向 Oracle 提交了该错误 但决定看看这里是否有人遇到过该问题 如果有 您是如何处理的 这是一个正在运行的网络应用程序 Linux 2 6 34 gentoo r6 1 S
  • 无法在 Windows 10 上安装 Windows SDK 7.1

    我是一名软件开发人员 拥有一台 Windows 10 电脑 我必须支持一些使用 Windows SDK 7 1 在 Visual Studio 2010 中编写的旧软件 在尝试搭建开发环境时 我已经成功安装了VS2010 并来安装Windo
  • GoogleTagManager 警告:未找到默认容器。容器需要添加到容器文件夹并添加到目标

    当尝试在我的 Swift 应用程序中实现 Google 跟踪代码管理器 v5 时 我遇到了以下警告 这给我带来了一些麻烦 GoogleTagManager 警告 未找到默认容器 需要将容器添加到容器文件夹并添加到目标 我花了比应有的时间更多
  • 无法将数据列从一个数据表复制到另一个数据表

    如何将 1 个数据表中的 1 个数据列复制到新的数据表中 当我尝试这样做时 我收到错误列 XXX 已经属于另一个数据表 dataColumn datatable1 Columns 1 datatable2 new DataTable dat
  • 如何以编程方式编辑路由表

    我正在编写一个在嵌入式平台上运行的守护程序 需要根据给定时间连接的接口来更改设备的默认路由 我怎样才能以编程方式做到这一点 我知道我可以使用 system route del default Route add default gatewa
  • 由于加密消息,无法将存储过程添加到数据库

    我设置了一个本地数据库 SQL Server 2017 Express 一切工作正常 但在 SSMS 中创建一个简单的存储过程时 我会遇到错误 例如 这个 CREATE PROCEDURE dbo EMS Operations SyncAs
  • 将 EF Core 列/字段指定为只读

    我有一个 SQL Server 表 其中包含数据库通过默认值设置的某些字段 一旦保存 应该never再次修改 例如DateCreated 在 Entity Framework Core 2 1 模型构建器或类中 我们如何将字段 标记 为本质
  • Plotly 中的行悬停文本

    我正在用 Plotly 绘制一个类似于Plotly 网站上的示例 除了图形节点上的悬停文本之外 我还希望边缘上有悬停文本 我尝试通过添加 名称 字段来修改边缘的跟踪对象来实现此目的 但这不起作用 而是将 名称 放在节点上 trace3 Sc
  • 鼠标移动旋转div

    我有以下代码来旋转 div 通过同一 div 右上角图像上的 mousedown 事件 我希望 div 旋转直到鼠标向上 从逻辑上讲 我相信代码很好 但点击后它就可以工作 当我单击其他项目时 旋转会停止 而不是鼠标松开 我认为在鼠标按下后拖
  • 使用curl和php从url读取xml数据

    我想从 URL 读取 XML 数据 我的网址如下 这是我的代码 Url http www arrowcast net fids mco fids asp sort city city number airline adi A if func
  • jQuery 选择器和反斜杠

    我有一个 dom 元素 其中包含完全限定名称作为 id 属性的一部分 div My Div div 让 jQuery 通过 ID 选择元素似乎是不可能的 这是我的实验 var e1 domain element div var e2 dom
  • 在数据库 mysql 中存储和检索同义词的最佳方法

    我正在制作一个同义词列表 我将其存储在数据库中并在进行全文搜索之前检索它 当用户输入 word1 我需要在同义词表中查找这个词 因此 如果找到该单词 我将选择该单词的所有同义词 并在下一个查询的全文搜索中使用它 我将在其中构造查询 例如 M
  • ggplot:仅在满足某些条件时才绘制图层

    有没有过滤的方法within ggplot本身 也就是说 说我想这样做 p lt ggplot iris aes x Sepal Width y Sepal Length species geom point size 4 shape 4
  • 扩展 Scala 集合

    我想要一个在尝试覆盖现有键的值时抛出的映射 我试过 trait Unoverwriteable A B extends scala collection Map A B case class KeyAlreadyExistsExceptio
  • 如何在 yacc 中将 yylval 与字符串一起使用

    我想传递令牌的实际字符串 如果我有一个名为 ID 的令牌 那么我希望我的 yacc 文件真正知道 ID 的名称 我想我必须使用 yylval 将字符串从 Flex 文件传递 到 yacc 文件 我怎么做 通过 yylval 返回字符串或任何