2

我似乎无法弄清楚如何在 yacc 中连接两个字符串。

这是 lex 代码

%{
#include <stdio.h>
#include "y.tab.h"
%}
%%
[0-9]+ {yylval.intval=atoi(yytext); return NR;}
[a-zA-Z]+ {yylval.strval=yytext; return STR;}
"0exit" {return 0;}
[ \t] ;
\n {return 0;}
. {return yytext[0];}

在这里我有添加两个字符串的基础知识

%{
#include <stdio.h>
#include <string.h>
%}
%union {
int intval;
char* strval;
}
%token STR NR
%type <intval>NR
%type <strval>STR
%type <strval>operatie
%left '+' '-'
%right '='
%start S
%%
S   : S operatie        {}
    | operatie          {printf("%s\n",$<strval>$);}
    ;

operatie    :   STR '+' STR {   char* s=malloc(sizeof(char)*(strlen($1)+strlen($3)+1));
                                strcpy(s,$1); strcat(s,$3);
                                $$=s;}
            ;
%%
int main(){
 yyparse();
}    

代码有效,问题是输出是这样的:如果我输入

aaaa + bbbb

我得到输出

aaaa + bbbbbbbb

4

2 回答 2

3

问题在这里:

yylval.strval = yytext;

yytext 随每个标记和每个缓冲区而变化。将其更改为

yylval.strval = strdup(yytext);
于 2013-01-22T01:59:24.370 回答
1

yytext仅在词法分析器开始寻找下一个标记之前有效。因此,如果您想将字符串令牌从 (f)lex 传递给 yacc/bison,则需要strdup它,并且解析器代码需要释放副本。

请参阅野牛常见问题解答

于 2013-01-22T01:56:20.993 回答