如何将 lex 文件中的 yytext 传递给 yacc?

2024-03-15

请我面临一个简单的问题..这就是问题, 在我的 lex 文件中,我有类似的内容:

char *ptr_String;

"name = "  { BEGIN sName; }

<sName>.+   {
          ptr_String = (char *)calloc(strlen(yytext)+1, sizeof(char));
              strcpy(ptr_String, yytext);
              yylval.sValue = ptr_String;
              return NAME;
    }

现在在我的 Yacc 文件中我有类似的内容:

stmt_Name:
    NAME
    {
        /*Now here i need to get the matched string of <sName>.+ and measure it's length. */
        /*The aim is simply outputing the name to the screen and storing the length in a global variable.
    }
    ;

请问有什么建议吗? 非常感谢您的所有时间和帮助。


修改后的问题

Yacc 堆栈上的值由 YYSTYPE 或%union。当类型信息简单时使用YYSTYPE;使用%union当它很复杂时。

我的语法之一包含:

struct Token
{
    int      toktype;
    char    *start;
    char    *end;
};
typedef struct Token Token;

#define YYSTYPE Token

由于各种原因(不一定是好的原因),我的语法使用手工制作的词法分析器而不是 Lex。

在语法规则中,您将示例中的 NAME 之类的项目引用为$1(其中实际数量取决于令牌出现在组成规则的令牌或终端列表中的位置)。

例如(相同语法):

disconnect
    :   K_DISCONNECT K_CURRENT
        { conn->ctype = CONN_CURRENT; }
    |   K_DISCONNECT K_ALL
        { conn->ctype = CONN_ALL; }
    |   K_DISCONNECT K_DEFAULT
        { conn->ctype = CONN_DEFAULT; }
    |   K_DISCONNECT string
        { conn->ctype = CONN_STRING;
          set_connection(conn, $2.start, $2.end);
        }
    ;

And:

load
    :   K_LOAD K_FROM opt_file_pipe string load_opt_list K_INSERT
        {
            set_string("load file", load->file, sizeof(load->file),
                       $4.start, $4.end);
            load->stmt = $6.start;
        }
    ;

不知道是否看到了手工制作的轮廓yylex()有帮助;在语法中,它是与以下内容位于同一文件中的函数yyparse().

static const char *c_token;     /* Where to start next token search */

static int yylex(void)
{
    char        buffer[MAX_LEXTOKENLENGTH];
    const char *start;

    if (c_token == 0)
        abort();

    if (bare_filename_ok)
        start = scan_for_filename(c_token, &c_token);
    else
        start = sqltoken(c_token, &c_token);

    yylval.start = CONST_CAST(char *, start);
    yylval.end = CONST_CAST(char *, c_token);
    if (*start == '\0')
    {
        yylval.toktype = 0;
        return yylval.toktype;
    }
    set_token(buffer, sizeof(buffer), start, c_token);
#ifdef YYDEBUG
    if (YYDEBUGVAR > 1)
        printf("yylex(): token = %s\n", buffer);
#endif /* YYDEBUG */

    /* printf("yylex(): token = %s\n", buffer); */
    if (isalpha((unsigned char)buffer[0]) || buffer[0] == '_')
    {
        Keyword  kw;
        Keyword *p;
        kw.keyword = buffer;
        p = (Keyword *)bsearch(&kw, keylist, DIM(keylist), sizeof(Keyword),
                                kw_compare);    /*=C++=*/
        if (p == 0)
            yylval.toktype = S_IDENTIFIER;
        else
            yylval.toktype = p->token;
    }
    else if (buffer[0] == '\'')
    {
        yylval.toktype = S_SQSTRING;
    }
    else if (buffer[0] == '"')
    {
        yylval.toktype = S_DQSTRING;
    }
    else if (isdigit((unsigned char)buffer[0]))
    {
        yylval.toktype = S_NUMBER;
    }
    else if (buffer[0] == '.' && isdigit((unsigned char)buffer[1]))
    {
        yylval.toktype = S_NUMBER;
    }

...识别各种单字符符号...

    else if (buffer[0] == ':')
    {
        assert(buffer[1] == '\0');
        yylval.toktype = C_COLON;
    }
    else
    {
        yylval.toktype = S_ERROR;
    }
    return yylval.toktype;
}

原问题

该变量通常是全局变量 - 您的 Yacc 代码使用两种可能的声明之一:

extern char *yytext;    /* Correct for Flex */
extern char yytext[];   /* Correct for traditional Lex */

其中哪一个是正确的取决于您的 Lex 版本如何定义它。

如果你想添加一个长度(也许yytextlen),那么你可以定义这样一个变量并让每个返回yylex()确保这件事yytextlen已设置。或者,您可以安排您的语法调用wwlex(), 和你的wwlex()简单地说:

int wwlex(void)
{
    int rc = yylex();
    yytextlen = strlen(yytext);
    return rc;
}

或者你可以安排 Lex 生成重命名的代码,并让 Yacc 继续调用yylex()并且您提供上面的代码yylex()并让它调用重命名的 Lex 函数。无论哪种方式都有效。

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

如何将 lex 文件中的 yytext 传递给 yacc? 的相关文章

  • 如何解决 YACC 移位/减少后增量运算符的冲突?

    我正在用 YACC 实际上是 Bison 编写语法 并且遇到了移位 归约问题 它是包含后缀递增和递减运算符的结果 这是语法的精简版本 token NUMBER ID INC DEC left left right PREINC left P
  • 按语法解析为 AST(或 .y+.lang => xml)的工具

    给定一个词法分析器定义文件 一个语法文件 例如 postgresql y lflex 和 bison 程序来自它的源树 以及由这些词法分析器和解析器定义的文件 例如 SQL 查询 以某种标准形式 例如 XML 的 JSON 获取 AST 该
  • 对“yylex”的未定义引用

    我正在尝试使用 flex 和 bison 解析一个输入文件 但在编译程序时遇到一个困难 我附上了我的 Flex 和 Bison 代码以及我收到的错误 请帮我解决这些错误 lex l include
  • 为什么这个简单的语法会有移位/归约冲突?

    token
  • yacc shift-reduce 处理不明确的 lambda 语法

    我正在用 Yacc 用 Go 打包的语言 编写一种玩具语言的语法 由于以下伪问题 我遇到了预期的移位归约冲突 我必须将问题语法提炼为以下内容 start stmt list expr INT IDENT lambda expr 2 lamb
  • 转移/减少野牛的冲突

    我是新来的Bison我在转移 减少冲突方面遇到麻烦 我正在尝试从文件加载到array data struct data char name 50 char surname 50 int year data 1000 这是我的野牛代码的一部分
  • 从 makefile 调用 flex

    我想调用 flex 来构建一个 l 文件 然后调用 gcc 来构建所有内容 I tryed comp lex scanner l gcc o a out main c hash c I error lex scanner l gcc o a
  • YACC 中的错误处理

    你好 我正在尝试制作一个简单的解析器并使用 lex 和 yacc 问题是我想打印我自己的错误消息而不是erroryacc 使用的打印符号syntax error 例如这是我的 yacc 代码 include
  • 使用 Flex 和 Bison 的简单 Java 语法

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

    给定 Bison 规范 right TOK ADD TOK MUL 我想知道 TOK ADD 和 TOK MUL 的优先顺序是什么 另外如果我有野牛规格 left TOKMUL TOKADD left TOKDIV left TOKSUB
  • 跟踪编译器中 AST 节点的源位置 (ocaml)

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

    我可以从 flex 和 bison 生成的文件编译一个程序 cc lex yy c program tab c o output 也由 cc lex yy c program tab c lfl o output 它们都运行顺利 没有任何问
  • yylineno 在 yacc 文件中始终具有相同的值[重复]

    这个问题在这里已经有答案了 对于编译器中的一个项目 我在语法分析器中遇到一个问题 当我在符号表中添加符号时 我在 yylineno 中始终采用相同的值 我一开始就是这样做的 int yylex void int yyerror char y
  • iOS 的标准语法解析器是什么?

    iPad 和 iPhone 的 iOS 支持解析器吗 特别是 lex yacc 或 flex bison 是否可用于 iOS 开发 xcode4 有原生支持的库吗 我可以通过 lex yacc 生成语法 然后获取 c 文件并将它们放入我的项
  • LR(k) 到 LR(1) 语法转换

    我对以下内容感到困惑quote http en wikipedia org wiki LR parser Theory来自维基百科 换句话说 如果一种语言足够合理 允许 高效的单遍解析器 可以用 LR k 语法来描述 语法总是可以机械地转化
  • 如何使 YY_INPUT 指向字符串而不是 Lex & Yacc (Solaris) 中的标准输入

    我想要我的yylex 解析字符串而不是文件或标准输入 如何使用 Solaris 提供的 Lex 和 Yacc 来做到这一点 重新定义YY INPUT 这是一个工作示例 使用命令编译并运行 yacc d parser y lex lexer
  • 开发类似 python 的小型语言时的缩进控制

    我正在使用 flex byacc 用于词法和解析 和 C 开发一种类似 python 的小型语言 但我有一些关于范围控制的问题 就像 python 一样 它使用空格 或制表符 进行缩进 不仅如此 我还想实现索引中断 例如 如果您在另一个 w
  • Yacc/Bison:伪变量($$、$1、$2、..)以及如何使用 printf 打印它们

    我有一个用 flex 编写的词法分析器 它将标记传递给用 bison 编写的解析器 以下是我的词法分析器的一小部分 ID a z a z0 9 rule printf A rule s n yytext return RULE ID pri
  • 在 Mac OS X 10.6 上编译和执行莎士比亚编程语言转换器 spl2c 会导致警告/错误

    我想尝试一下莎士比亚编程语言 http shakespearelang sourceforge net report shakespeare 所以我从here http shakespearelang sourceforge net 并使用
  • 无法弄清楚为什么 Bison 抛出“由于冲突,规则在解析器中无用”

    我正在为一种非常简单的编程语言编写 BNF 语法 并使用 Flex 和 Bison 进行编译 我只有 3 种变量和常量类型 实数 整数 字符串 我的 l 文件具有 ID 的标记定义 如下所示 DIGIT 0 9 LETTER a zA Z

随机推荐

  • 来自 Python 的 AWS 网络负载均衡器后面的客户端 IP

    当在网络负载均衡器后面运行套接字服务器时 实例由 IP 指定 server sock socket socket family socket AF INET type socket SOCK STREAM proto socket IPPR
  • InvalidArgumentError:索引[0,0] = -1 不在 [0, 10) 中

    它与 MLP 一起进行二元分类效果很好 然而 在 LSTM 和卷积中 它给出了InvalidArgumentError 我发现 y 需要重塑 我就这么做了 我尝试了 x 的所有正值 并且模型运行良好 那么负值有什么问题呢 数据在代码中给出
  • Android 应用程序使用 android.permission.READ_LOGS - 这是不礼貌的吗?

    我有一个可以从 Android Market 获取的应用程序 一些用户要求在事情没有按预期进行时进行调试 我一直在考虑添加一个菜单项来显示输出 Process mLogcatProc null BufferedReader reader n
  • Dagger2:用组件本身注入模块提供的实现类

    考虑到模块都是通过 Dagger1 规范相互共享的complete false library true 您可以收到由 Provides通过构造函数参数的方法 就像这样 public class GetUserForUsernameTask
  • 如何计算列表中项目的出现次数

    我是 Dart 新手 目前我有一个重复项目列表 我想计算它们的出现次数并将其存储在地图中 var elements a b c d e a b c f g h h h e a 我想要得到这样的结果 a 3 b 2 c 2 d 2 e 2 f
  • 格式 - 帮助打印表格

    这个问题可能会以捂脸结束 但我已经尝试了一段时间 尽管阅读了超规范 但仍然卡住了 基本上我想做的是 format t 5d 1 23 2 312 23 456 1 7890 但不应该对 5 进行硬编码 而是应该从列表中计算 任何嵌套列表中最
  • 从 ANDROID 2.2 发送 UDP 包(HTC 希望)

    我有一个局域网 我想从我的 android htcdesire 发送一条 udp 消息到我的电脑 它们之间有一个 WLAN 路由器 问题是 UPD 消息永远不会到达 PC Android上的代码 package org example an
  • JSON 架构允许日期或空字符串

    我需要定义一个 JSON 模式 其中输入可以是日期或空字符串 我当前的 JSON 架构是 type object required FirstName DateOfBirth properties FirstName type string
  • R - 自动调整 Excel 列宽

    如何使用自动调整列宽openxlsx 我的其中一列有一个日期变量 例如21 08 2017 并且如果使用复制ctrl c从 Excel 中 并正常粘贴到其他地方 它显示为 如果增加列宽以显示 Excel 中的内容 则可以正常粘贴 我想将重复
  • 在 d3 中设置 id 问题

    这就是我正在做的 selection canvas selectAll circle data mydata selection enter append circle selection attr id function d i var
  • Scala - Slick - 获取包装选项的 TypedType[T]

    通常创建这样的自定义 ID case class CustomID value Int extends MappedTo Int 并用 Option CustomID 等类型表示可为 null 的自定义 ID 但是 我希望能够将 Optio
  • 为什么 >= 有效但 => 无效?

    当检查一个整数是否等于或大于当前数字时 所以我输入 if 5 gt 6 Bla 但它显示这是一个错误 为什么 这不是完全一样吗 if 5 gt 6 Bla 它不起作用的原因是因为 gt 不等于 gt gt 用于拉姆达表达式 http msd
  • Nil 和 List 作为 Scala 中的 case 表达式

    此代码编译 def wtf arg Any arg match case Nil gt Nil was passed to arg case List gt List was passed to arg case gt otherwise
  • Java - split(regex, limit) 方法实际上如何工作? [复制]

    这个问题在这里已经有答案了 我试图了解 split 方法的工作原理 但对此有些困惑 在 oracle 文档页面给出的这个示例中 String str boo and foo String str1 str split o 2 Output
  • 如何在 AWS Lambda 函数中获取 AWS API Gateway 调用 URL?

    我正在将代理集成与 Java lambda 函数结合使用 lambda 处理程序的输入是一个表示传入请求的 JSON 对象 它有正文 标头 查询参数等 但它不包括 API 网关解析的正文的源 URL 查询参数等 有没有办法获取它 问题是 A
  • 姜戈树胡子 AL、NS、MP 之间有什么区别

    我正在尝试制作一个模型来对某些对象进行分类 我已经尝试使用 django mptt 轻松检索相关类别 现在我正在搜索不同的解决方案以找到最好的解决方案 我无法找出物化路径 邻接列表和嵌套集之间的主要区别 维基百科没有给我一个简短的答案 我所
  • 在 VB.Net 中获取 COM 对象的特定实例

    我正在 Net 中编写一个 Windows 窗体应用程序 以列出第三方 CAD CAM 软件 在本例中为 CATIA 的所有正在运行的实例 并让用户选择其中一个来执行几个自动化任务 为了执行自动化任务 我需要获取 COM 对象的特定实例 与
  • 我应该如何使用 Laravel 提供图像?

    我将用户个人资料图片存储在 laravel 存储文件夹而不是公共文件夹中 因为我想保持公共文件夹干净 避免用户混乱 为了从该文件夹提供图像 我创建了一个简单的控制器操作 如下所示 public function profilePicture
  • R:无法分配大于 x MB 的内存

    我在 R 中有一个 main 函数 它调用其他文件来运行我的程序 我通过bat文件 exe 调用主文件 当我逐行运行它时 它运行时不会出现内存错误 但是当我调用 bat 文件来运行它时 它会停止并给出以下错误 无法分配大于 51 MB 的内
  • 如何将 lex 文件中的 yytext 传递给 yacc?

    请我面临一个简单的问题 这就是问题 在我的 lex 文件中 我有类似的内容 char ptr String name BEGIN sName