📜  YACC程序,用于将中缀转换为后缀表达式

📅  最后修改于: 2021-06-28 07:46:11             🧑  作者: Mango

问题:编写YACC程序以将Infix转换为Postfix表达式。

解释:
YACC(还有另一个Compiler-Compiler)是Unix操作系统的标准解析器生成器。 yacc是一个开源程序,它使用C编程语言为解析器生成代码。首字母缩略词通常用小写字母表示,但有时被视为YACC或Yacc。

例子:

Input: a*b+c 
Output: ab*c+

Input: a+b*d
Output: abd*+ 

词法分析器源代码:

%{
  /* Definition section */
%}
ALPHA [A-Z a-z]
DIGIT [0-9]
  
/* Rule Section */
%%
{ALPHA}({ALPHA}|{DIGIT})*  return ID;
{DIGIT}+                   {yylval=atoi(yytext); return ID;}
[\n \t]                    yyterminate();
.                          return yytext[0];
%%

解析器源代码:

%{
   /* Definition section */
   #include 
   #include 
%}
  
%token    ID
%left    '+' '-'
%left    '*' '/'
%left    UMINUS
  
/* Rule Section */
%%
  
S  :  E
E  :  E'+'{A1();}T{A2();}
   |  E'-'{A1();}T{A2();}
   |  T
   ;
T  :  T'*'{A1();}F{A2();}
   |  T'/'{A1();}F{A2();}
   |  F
   ;
F  :  '('E{A2();}')'
   |  '-'{A1();}F{A2();}
   |  ID{A3();}
   ;
  
%%
  
#include"lex.yy.c"
char st[100];
int top=0;
  
//driver code
int main()
{
    printf("Enter infix expression:  "); 
    yyparse();
    printf("\n");
    return 0;
}
A1()
{
    st[top++]=yytext[0];
}
  
A2()
{
    printf("%c", st[--top]);
}
  
A3()
{
    printf("%c", yytext[0]);
}

输出: