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(); }
我有以下用于 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(); }