mslomp
(usa Slackware)
Enviado em 13/05/2009 - 20:59h
em um resumo bem resumido é o seguinte:
flex (lex*) é um parser generator, ou seja, gera um analisador léxico para uma dado alfabeto. então, no caso da calculadora**, você vai definir o que é número (1,2,3...), o que é variável (x,y,z...), o que é operador (+,-,*,/...), etc. então, quando você entra com uma expressão, o analisador léxico irá dividi-la em tokens, verificando se cada um faz parte do alfabeto e qual sua classe.
estando tudo ok (todos os tokens pertencem à gramática), e de posse das classes de cada token, sua expressão como um todo será avaliada por um analisador sintático, sendo este gerado pelo bison (yacc*). é onde você definirá as regras da sua gramática. por exemplo, definir a regra que diz que numero '+' numero irá retornar como resultado a soma dos operandos, etc, além de definir outras minúcias como a precedência dos operadores (multiplicar antes de somar, etc).
recomendo a leitura dos seguintes links:
o básico, ideal para quem nunca mexeu com flex/bison:
http://dinosaur.compilertools.net
ótimo tutorial, inclusive tem um exemplo bem completo de calculadora:
http://epaperpress.com/lexandyacc
* apenas para não causar confusão: flex é o 'substituto gnu' para o lex, e bison é o 'substituto gnu' para o yacc. a sintaxe é a mesma.
** a saber: a calculadora bc foi construída com flex + bison.