ANALISADOR LÉXICO PARA PC

RAUL H.C.LOPES

1. Introdução

Este documento apresenta um analisador léxico na linguagem de Alex, que é um gerador de analisadores. O programa Alex lê uma descrição do léxico de uma linguagem L e gera um programa que faz a análise léxica de qualquer documento dado para descobrir se ele está escrito na linguagem L.

Por exemplo, se seu objetivo consiste em lidar com fórmulas do cálculo de proposições, a sua linguagem deverá ter sentenças(as fórmulas do cálculo de proposições) construidas com os seguintes tokens, entre outros: variáveis proposicionais (como p, q, r) e constantes lógicas, como ⇒, ∧. Entenda os tokens da linguagem como as palavras válidas da mesma. Os símbolos usados para escrever os tokens são o alfabeto da linguagem.

A descrição do léxico de uma linguagem apresenta:

• O alfabeto (conjunto de símbolos) admissíveis na construção de tokens da linguagem. Note que isso inclui nãoapenas símbolos para construir palavras, mas também sinais de pontuação.

• As palavras (tokens) aceitáveis da linguagem.

1.1. A geraçãodo analisador. Use o programa lst2code.pl para extrair o programa em Alex que descreve um linguagem de fórmulas do cálculo proposicional:

  ./lst2code.pl PCTokens.tex

Esse comando gerará um arquivo de nome PCTokens.x. Esse arquivo contém um programa em Alex. Use Alex para transformá-lo em um programa em Haskell, que conterúm analisador léxico para o cálculo de proposições.

  alex -o PCTokens.hs PCTokens.x

A linha acima executa o programa Alex, que lerá o arquivo PCTokens.x e produzirá o arquivo PCTokens.hs, contendo um analisador léxico (escrito em Haskell) para o cálculo de proposições.

1.2. Onde encontrar o Alex. O link

 http://www.haskell.org/alex/

contém pacote RPM, fontes e documentação do Alex.

1.3. O programa lst2code.pl. O programa lst2code.pl segue neste diretório. Ele é ligeiramente diferente do programa de mesmo nome divulgado anteriormente: as diretivas com nome de arquivos de output devem agora aparecer em linhas isoladas.

2. O que o analisador exporta

O seu programa em Alex (que descreve o léxico do Cálculo de Proposições) começa com um trecho de código que será incorporado diretamente ao analisador em Haskell. Sempre necessitar fazer isso, cerque o código a incorporar no analisador com ’{’ e ’}’.

{

module PCTokens ( Token ( . . ) , alexScanTokens ) where

}

O trecho acima incorpora a linha

  module PCTokens (Token(..), alexScanTokens) where

no topo do código em Haskell do analisador. Ele descreve o que o módulo PCTokens exporta. Repare que alexScanTokens é função gerado por Alex, que realizará a análise léxica de qualquer texto.

A linha a seguir importa um módulo, basic, do Alex.

%wrapper ” b a s i c ”

3. Os tokens da linguagem

O alfabeto do Cálculo de Proposições admitirá:

• dígitos e caracteres alfabéticos, que serão usados para formar nomes de vari

• conectivos para representar as constantes lógicas: ∧ para con-

junção, ∨ para disjunção, etc. O trecho abaixo dá nomes para alguns desses símbolos: por exemplo,

estabele que $digit é qualquer dígito de 0 a 9.

$ d i g i t = 0−9  −− d i g i t s
$alpha = [ a−zA−Z ]  −− a l p h a b e t i c c h a r a c t e r s

$ d i s j = [ \ |]
$neg = [\−]
$conj = [\&]

3.1. The real stuff. A descrição das ações do analisador começa com a palavra reservada tokens:

tokens :−

O programa em Alex contém uma seqüência de linhas contendo cada uma um par designando: texto esperado no input e ação a realizar se o texto ocorrer. Por exemplo, no trecho a seguir

• $white denota uma ocorrência de um espaço no input;

• $white+ denota a ocorrência de ao menos um espaço no input;

• essa regra manda que espaços no input sejam ignorados:

$white+  ;
”−−+”. ∗  ;

A linha seguinte manda que ao encontrar a seqüência ’–+’ o restante da linha seja ignorado.

No trecho a seguir, a primeira linha manda que ao ser encontrado o símbolo da disjunção o analisador retorne o token correspondente: TokDisj.

$ d i s j  { \ s −> TokDisj }
$neg  { \ s −> TokNeg}
$conj  { \ s −> TokConj}
\(  { \ s −> TokOpen}
\)  { \ s −> TokClose}
\=\>  { \ s −> TokImp}
\<\=\>  { \ s −> TokEquiv}

A última ação do analisador recomenda que diante de um input constituído de um caracter alfabético e zero ou mais caracteres alfabéticos ou dígitos, um token contendo o string lido seja retornado: (TokVar s) constói um token a partir de um string ’s’.

$alpha [ $alpha $ d i g i t ] ∗  { \ s −> TokVar s }

4. Os tokens como tipo indutivo em Haskell

Um novo trecho de código em Haskell, precedido de ’{’ e seguido de ’}, declara o tipo Token, que é uma enumeração de todos os tokens da linguagem.

{
−− Each r i g h t−hand s i d e has type : : S t r i n g −> Token
−− The token type :
data Token =
TokNeg  |
TokDisj  |
TokConj  |
TokImp  |
TokEquiv  |
TokOpen  |
TokClose  |
TokVar String  |

TokEOF

deriving (Eq,Show)

}

Esse programa em Alex gerará um analisador léxico, escrito em Haskell. A função inicial do analisador gerado será alexScanTokens, que mapeará uma lista de caracteres para uma lista de tokens.

5. Alex, lex, flex

O programa Alex e sua linguagem são modelados no programa lex do sistema operacional Unix, escrito na década de 70 e que gera analisadores léxicos. Nos sistemas operacionais como Linux e FreeBSD, flex, uma versão mais moderna de lex, é encontrado.