【发布时间】:2016-04-03 08:56:36
【问题描述】:
我是 lex 和 yacc 程序的新手。我一直在尝试编写一个 yacc 程序,该程序将算术表达式作为输入并给出前缀符号作为输出。 这是我的 lex 代码。
%{
#include<string.h>
#include"pre.tab.h"
%}
%%
"*"|"/"|"+"|"-"|"("|")" {return yytext[0];}
[0-9]+ {yylval.name=(char*)malloc(yyleng+1);
strcpy(yylval.name,yytext);
return NUM;}
\n {return(0);}
[a-zA-Z][a-zA-Z]* {yylval.name=(char*)malloc(yyleng+1);
strcpy(yylval.name,yytext);
return ID;}
. {}
%%
int yywrap()
{
return 1;
}
这是我的 YACC 代码
%{
#include<stdio.h>
#include<string.h>
char buf[10];
%}
%union
{
char *name;
}
%token<name>NUM ID
%type<name>E
%left'+''-'
%left'*''/'
%nonassoc UMINUS
%%
S:E {printf("\n%s",$1);}
;
E:E'*'E {buf[0]='\0';strcpy($$,strcat(strcpy(buf,"*"),strcat($1,$3)));}
|E'/'E {buf[0]='\0';strcpy($$,strcat(strcpy(buf,"/"),strcat($1,$3)));}
|E'+'E {buf[0]='\0';strcpy($$,strcat(strcpy(buf,"+"),strcat($1,$3)));}
|E'-'E {buf[0]='\0';strcpy($$,strcat(strcpy(buf,"-"),strcat($1,$3)));}
|ID
|NUM
|'('E')'{strcpy($$,$2);}
;
%%
main()
{
yyparse();
}
int yyerror(char *s) {fprintf(stderr,"%s\n",s);}
当我在括号中输入算术表达式时,我没有得到任何输出。例如:输入:1+(2*3) 输出:+*23*23。我曾多次尝试纠正代码但徒劳无功。
【问题讨论】:
-
空格键坏了?你有什么收获吗?语法错误?
-
@EJP 我没有得到任何输出。当我输入 1 + 2 时,命令提示符中没有显示任何内容。我输入1+2时也是这样
-
查看半标准函数
strdup和asprintf,可用于 Linux、Windows、OSX、*BSD 和大多数类 unix 系统...
标签: compiler-construction yacc lex