Ultima Alteracao: 17/04.98

Lex

O lex é um gerador de analisador léxico que faz parte do pacote do sistema operacional UNIX. Ele recebe uma especificação num arquivo de extensão .l, contendo o conjunto de expressões regulares que ele deve reconhecer e ações associadas a cada expressão reconhecida. Na sua versão inicial, o lex gera um arquivo em linguagem C que faz o reconhecimento dos padrões desejados, que pode ser compilado pelo compilador C do UNIX. Atualmente podemos encontrar versões do lex para a maioria das principais linguagens, como Pascal, C++ e Java , e ainda versões diferenciadas do lex como o flex, da GNU.

Um programa lex é dividido em três partes, separadas pelos símbolos %%: declarações, regras de tradução e procedimentos auxiliares. Na seção de declarações são feitas as declarações de variáveis e de definições regulares a serem usadas na seção seguintes. Na seção de contém as regras de tradução, são colocados enunciados na forma:

p1 {ação1}
p2 {ação2}
...
pn {açãon}
onde pk é uma expressão regular que pode ser reconhecida pelo analisador léxico gerado e {açãon} é a ação que deve ser realizada quando tal expressão é reconhecida. Na última seção do programa lex, são colocadas as definições de procedimentos necessários para a realização das ações especificadas ou auxiliares para a ação do analisador léxico.

Uma típica especificação para uma analisador léxico é a de detectar um identificador. A expressão regular para definição de identificadores, na sintaxe de lex, pode ser escrita como

identificador {letra} ({letra} | {digito})*
muito parecida com a definição formal de expressões regulares mostradas anteriormente. Este definição carece da identificação das expressão letra e digito. Elas podem ser
letra [A-Za-z]
digito [0-9]
onde se colocou entre colchetes o conjunto de caracteres reconhecidos em cada expressão, no caso de letra são os caracteres de A até Z e a até z (o símbolo "-" é usado para indicar uma faixa de caracteres).

Todas essas definições fariam parte da seção de definições.

Na seção seguinte devemos dizer para o analisador a ser gerado que ações ele deve realizar quando receber um identificador no fluxo de entrada. Ações típicas seriam instalar o identificador na tabela de símbolos (função instalar_id()) e retornar um identificador ID, como indicado no código seguinte.

identificador {yylval = instalar_id(); return (ID);}
A variável yylval, que está disponível para o analisar sintático, recebe o conteúdo do corrente lexema reconhecido e ID permitirá ao parser identificar qual o token que foi reconhecido. É necessário colocar ID na seção de declarações do programa lex, entre %{ e %}, que o compilador lex se encarregará de declará-lo com um valor único. A função instalar_id()deverá ser também declarada, mas na seção de funções auxiliares e seu código deverá ser completamente especificado. O programa final lex ficaria assim:
/* seção de declaração de variáveis */
%{ 
ID 
%} 
letra [A-Za-z] 
digito [0-9] 
identificador {letra} ({letra} | digito})*
%%
/* seção de regras de tradução */
{identificador} {yylval = instalar_id(); return (ID);}
%%
/* funções auxiliares */
instalar_id(){
...
...
}
Veja mais exemplos

VoltarHomePróximoe-mail