Análise Sintáctica em C

Para o C existem duas ferramentas que possibilitam a construção de analisadores sintácticos com alguma facilidade: o gerador de analisadores lexicográficos (tokenisers) flex e o gerador de analisadores sintácticos (parsers) bison.

A entrada da ambas as aplicações são ficheiros com três secções separadas por linhas com os símbolos %%:

%{
  declarações em C
}%
definições/declarações (a usar na secção seguinte)
%%
regras de reconhecimento dos tokens ou produções da gramática
%%
código C

Definição do analisador lexicográfico

Consideremos um pequeno exemplo para somas de inteiros. Para o flex teremos o ficheiro calculadora.lex com o seguinte conteúdo:
    %{
    #include "calculadora.tab.h" /* ficheiro produzido pelo bison */
    %}

    %%

    [0-9]+          yylval = atoi(yytext); return INTEIRO;

    "+"             return '+';

    [ \t]           ; /* ignora espaços e tabs (\t) */

    "\n"            return FIM_LINHA;
Observações:

Definição do analisador sintáctico

Para o bison teremos o ficheiro calculadora.y com:
    %{
    #include <stdio.h>

    void yyerror(char *); /* ver abaixo */
    %}

    %token INTEIRO
    %token FIM_LINHA

    %start linha

    %%

    linha: expressao FIM_LINHA { printf("valor: %d\n", $1); }
	 ;

    expressao: expressao '+' termo { $$ = $1 + $3; }
	     | termo { $$ = $1; }
	     ;

    termo: INTEIRO { $$ = $1; }
	 ;

    %%

    int main(int argc, char **argv)
    {
      return yyparse();
    }

    /* função usada pelo bison para dar mensagens de erro */
    void yyerror(char *msg)
    {
      fprintf(stderr, "erro: %s\n", msg);
    }
Observações:

Compilação

O executável calculadora é criado através da sequência de comandos
flex calculadora.lex # cria o ficheiro lex.yy.c
bison -d calculadora.y #
cria os ficheiros calculadora.tab.{c,h}
gcc -o calculadora calculadora.tab.c lex.yy.c -lfl
Mais informação sobre estas ferramentas pode ser obtida executando os comandos info flex e info bison ou nos manuais online do flex e do bison.