Expressão regular

3 respostas
luistiagos

Ola preciso fazer um compilador de pascal em java… e to com problema
na primeira parte do analizador lexico… tipo para reconhecer uma variavel ultilizando javax.regex como faço a expressão regular para
não aceitar numeros no começo? tentei: [^0-9]?[[A-Z]+[a-z]]* e não deu certo e outra coisa para fazer a analize leio linha a linha do meu documento e uma linha pode ter uma string: “program simulacao1”
dai ele teria que me retornar 2 tokiens: “program” e “simulacao1” nos meus testes ele acha a string inteira sem separalas por espaço… preciso que ele delemite os espaços…
como faço para que o regex encontre as duas palavras e separe elas em tokiens? (encontrar varias ocorrencias de um determinado tokien em uma string…)

3 Respostas

T

Amigo, se você precisa fazer um compilador (não importa para que linguagem), não é muito adequado usar expressões regulares. Elas não resolvem tudo, e algumas coisas são difíceis de serem representadas como expressões regulares.

O caso clássico é o de comentários que se estendem por várias linhas (no caso do Pascal, eles podem ser “{ … }” ou “(* … *)” ). O problema é que provavelmente você vai ler o programa linha por linha, e você teria problemas ao tratar as quebras de linha.

Use um gerador de analisadores léxicos - estude o JavaCC, por exemplo.
Se quiser fazer “na mão”, estude o fonte da classe java.io.StreamTokenizer, (http://java.sun.com/j2se/1.5.0/docs/api/java/io/StreamTokenizer.html ; o fonte está dentro do arquivo src.zip que vem junto com o JDK). Esse fonte é um “tokenizer” que serve bem para C e Java, e deve ser adaptado para Pascal (principalmente porque as regras para comentários são diferentes).

T

Em inglês há as palavras “token” (ficha) e “Tolkien” (o meu nickname vem do personagem “Thingol” de um livro de J. R. R. Tolkien, “O Silmarillion”. ) “Tokien” parece ser uma palavra em basco :stuck_out_tongue:

antoniopopete

Bem amigo eu usei expressoes regulares no meu projeto de compiladores para o analisador lexico fazer o reconhecimento de padroes lexicos e consegui resolver todas partes da especificacao.
Para fazer a quebra da String por " " voce deve usar o metodo split da classe String que quebra em um vetor de Strings toda a String separada pelo delimitador passado como parametro
Eu n~~ao faria assim,justamtenete pela limitação dos filtros de primeiro nivel e comentario.
Eu fiz lendo caracter a caracter a partir de um buffer do arquivo que peguei da classe RandomAcessFile que tem um metodo seek que movimenta o ponteiro de leitura.
Ou entao tentaria fazer usando buffer de entrada do arquivo,quebrando a leitura em blocos de leitura e manipulando esses blocos ate o fim deles,carregando,etc…Por ser projeto academico,a leitura direta do arquivo,acho que não tem muito impacto…Se não for projeto academico,procure sobre buffer de 2 metades usando sentinelas.
Eu fiz um projeto recenetemente,não consegui deixar melhor,porque ainda tinha que acabar o analisador sintatico,e nao daria tempo(por sinal,meu sintatico nao funcionou tambem,porque os automatos estavam errados)…
Ahh,para usar as expressoes regulares criei um buffer do que eu estava formando no momento de cada formacao de um novo atomo.

Criado 20 de junho de 2007
Ultima resposta 20 de jun. de 2007
Respostas 3
Participantes 3