首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Bison令牌是字符串的其余部分。

Bison令牌是字符串的其余部分。
EN

Stack Overflow用户
提问于 2015-12-27 14:08:03
回答 1查看 512关注 0票数 2

我已经写了一个挠曲和野牛,我正面临一个问题,这是通过下面的程序说明。

该程序旨在解析由等于(=)号分隔的键值对,我希望我的bison脚本标记该键和值并打印它们。

下面是我的flex程序的片段

代码语言:javascript
运行
复制
%{
    /* file : kvp.l */
    #include <stdio.h>
    #define YYSTYPE char*
    #include "kvp.tab.h"
%}

%%
[a-zA-Z0-9][_a-zA-Z0-9]*    {
                                yylval=yytext;
                                return IDENTIFIER;
                            }
"="                         {
                                yylval=yytext;
                                return EQUALS_OP;
                            }
.                           ; /* Do Nothing */
%%

int yywrap()
{
    return 1;
}

下面是野牛的节目

代码语言:javascript
运行
复制
%{
    /* file : kvp.y */
    #include <stdio.h>
    #include <stdlib.h>

    /* interface to the lexer */
    int yylex();
    int yyerror (char const *s);
%}

%token IDENTIFIER EQUALS_OP
%start stmt

%%
stmt: stmt pair | pair;
pair: IDENTIFIER EQUALS_OP IDENTIFIER
                                        {
                                            printf("YACC : Key     = \"%s\"\n", $1);
                                            printf("YACC : Equals  = \"%s\"\n", $2);
                                            printf("YACC : Value   = \"%s\"\n", $3);
                                        };
%%

int yyerror (char const *s)
{
    fprintf (stderr, "Error String = \"%s\"\n", s);
}

int main( int argc, char* argv[])
{
    yyparse();
    return 0;
}

我从这个项目中得到的结果如下。

代码语言:javascript
运行
复制
student@debian:~/stack-overflow$ flex kvp.l
student@debian:~/stack-overflow$ bison -d --file-prefix=y kvp.y
student@debian:~/stack-overflow$ gcc lex.yy.c  y.tab.c -o parser
student@debian:~/stack-overflow$ ./parser 
earth=planet
YACC : Key     = "earth=planet"
YACC : Equals  = "=planet"
YACC : Value   = "planet"

可以看到,正在打印的令牌是不正确的,从令牌开始的整个字符串正在打印。请告诉我这个计划出了什么问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-27 14:51:13

问题是,您正在保存指向yytext的指针,稍后将在flex扫描仪中更新该指针。如果将其更改为在yytext中保存字符串的副本,则会得到更一致的结果,例如,

代码语言:javascript
运行
复制
yylval = strdup(yytext);

而不是

代码语言:javascript
运行
复制
yylval = yytext;

进一步读:

  • *
  • 21.3关于yytext和内存的注记
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34481209

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档