lex 和 yacc 解析三角表达式

lex and yacc to parse trignometric expression

我有以下用于 lex 和 yacc 的代码。任何人都可以告诉我,我在打印的声明中获得了额外的价值。代码有什么问题?

莱克斯代码:

%{
#include <stdio.h>
#include "y.tab.h"
%}

%%
[ \t] ;
[+-]  { yylval=yytext; return Sym;}
(s|c|t)..x  { yylval=yytext; return Str;}
[a-zA-Z]+  { printf("Invalid");}
%%
int yywrap()
{
return 1;
}

yacc代码:

%{
#include<stdio.h>
%}

%start exps
%token Sym Str

%% 
exps: exps exp 
    | exp
    ;
exp : Str Sym Str {printf("%s",); printf("%s",); printf("%s",);}
    ;
%%

int main (void) 
{
while(1){
return yyparse();
}
}

yyerror(char *err) {
    fprintf(stderr, "%s\n",err);
}

输入: sinx+cosx

输出: sinx+cosx+cosxcosx

看看代码的输出!!!

yytext 是指向 flex 内部扫描缓冲区的指针,因此在读取下一个令牌时会修改其内容。如果你想return它到解析器,你需要做一个副本:

[+-]  { yylval=strdup(yytext); return Sym;}
(s|c|t)..x  { yylval=strdup(yytext); return Str;}

如果符号是单个字符,直接在扫描仪中 return 该字符可能更有意义:

[-+]  { return *yytext; }

在这种情况下,您的 yacc 规则应该直接使用 ' 中的字符 - 单引号:

exp : Str '+' Str {printf("%s + %s",, ); free(); free(); }
    | Str '-' Str {printf("%s - %s",, ); free(); free(); }