.:: Menu Rápido ::.

Linux | C/C++ | Downloads | SDL | [×]

sábado, 17 de novembro de 2007

Analisador léxico de arquivos script

Análise léxica é o processo de analisar uma entrada de caracteres e produzir uma seqüência de símbolos chamado "símbolos léxicos" (lexical tokens) que podem ser manipulados mais facilmente (Wikipédia).
Analisar dados em um arquivo de texto é normal, mas quem nunca fez vai precisar de uma mãozinha.
Aprenda a criar um analisador e veja o meu exemplo de 100 linhas !

» Post Completo...

# Resolução da tela: 800,600 ou 1024,768 ou personalizado
resolucao = 800, 600
# FullScreen (Tela cheia): sim ou nao
fullscreen = sim
# Som: sim ou nao
son = sim
# Volume: de 0 até 100
volume = 90

XML é melhor para trabalhar com dados, mas um script tem suas vantagens e uma delas é a simplicidade.

*** Esboço ***
Sempre que vou criar um analisador, gosto de criar um esboço do que chamo de Autômato:

Como eu disse, é apenas um esboço.
[Estados (Bolinhas)]
0 - Estado inicial
1 - Trata variáveis
2 - Trata valores
3 - Trata strings
4 - Trata caractere \ de escape
5 - Trata comentários
[Símbolos]
N - Números
L - Letras
* - Qualquer símbolo
[Outros]
Um traço para um quadrado - Algo que terei que tratar no código.

*** Programação ***
Analisar um script é sopa !
O bom de um autômato é que você pode analisar e manipular ao mesmo tempo. Mas dependendo do número de regras a coisa vai se complicando.
Perceba que o autômato acima só possui 6 estados, e mesmo assim precisei de 100 linhas de código.

» Primeiro é preciso de um loop para correr todos os caracteres.
» Cada estado pode ser visto como um case: num switch.
» Cada caractere lido é tratado por um if que além de outras coisas define o est (estado).
» Para ter mais organização, usei uma enumeração: enum ESTADOS{ZERO, VAR, VAL, STR, ESC, COMENT}
» Para que a função analisadora pudesse analisar um bloco de cada vez, defini est como static: static int est

Não resolvi todos os problemas. A função analisadora funciona, mas ela simplesmente imprime o resultado na tela.
Uma boa estrutura de dados seria algo como:

struct Variavel{
String nome;
Lista valores; //- lista do tipo String
};
Lista variaveis; //- lista do tipo Variavel

Como será implementada a estrutura de dados fica a gosto do cliente !!!

*** Link's ***
Download: » Código fonte

2 comentários:

Anônimo disse...

Aqui na Siemens usamos o AntLr em Java para fazer análise léxica e sintática. Já ouviu falar da ferramenta?

Diogo_RBG disse...

Tô por fora de Java, mas vlw a dica !
Esta é a forma que eu uso para fazer análises, mas pretendo melhorá-la utilizando alguma biblioteca específica para isto.