Problema: Escreva o programa YACC para conversão de binário em decimal.

Explicação:
Yacc (para “mais um compilador compilador.”) É o gerador de analisador padrão para o sistema operacional Unix. Um programa de código aberto, o yacc gera código para o analisador na linguagem de programação C. O acrônimo é geralmente processado em minúsculas, mas às vezes é visto como YACC ou Yacc.

Exemplos:

Input: 0101
Output: 5

Input: 1101
Output: 13

Input: 111001
Output: 57

Input: 1111111
Output: 127

Input: 100111000
Output: 312 

Código-fonte do Lexical Analyzer:

%{
  /* Definition section */
  #include<stdio.h>
  #include<stdlib.h>
  #include"y.tab.h"
  extern int yylval;
%}
  
/* Rule Section */
 %%
 0 {yylval=0;return ZERO;}
 1 {yylval=1;return ONE;}
   
 [ \t] {;}
 \n return 0;
 . return yytext[0];
%%
  
    
int yywrap()  
 {  
  return 1;  
 }  

Código-fonte do analisador:

%{
  /* Definition section */
  #include<stdio.h>
  #include<stdlib.h>
  void yyerror(char *s);
%}
%token ZERO ONE
  
/* Rule Section */
%%
N: L {printf("\n%d", $$);}
L: L B {$$=$1*2+$2;}
| B {$$=$1;}
B:ZERO {$$=$1;}
|ONE {$$=$1;};
%%
  
//driver code 
int main()
{
 while(yyparse());
}
  
yyerror(char *s)
{
 fprintf(stdout, "\n%s", s);
}
  

Saída: