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}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.
p2 {ação2}
...
pn {açãon}
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]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).
digito [0-9]
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