Galera tenho um trabalho pra fazer sobre um analisador Lexico,
Neste trabalho o Usuario vai digitar a logica definida…
Estou colocando um jTextArea e nele gostaria que cada linha saisse o numero da linha , pois no final do cogido simulado… o analisador devera mostrar o que é token e indentificador…
Gostaria de instruçoes como poderia fazer este simulador!
Simulando Analisador Lexico
11 Respostas
Opa! Pergunta massa!
Então… essa lógica que você diz são os padrões, certo? (Ou seja, o que é palavra reservada, o que é sinal de operação, mimimi). Essa parte você já fez? O JTextArea que você referiu é onde vão as regras?
Sobre o JTextArea, quando o cara der ‘enter’, provavelmente vai surgir um ‘\n’ no final da linha. De qualquer forma, você pode fazer o seguinte: depois que ele terminar de digitar, pegue como uma String (ou StringBuffer, StringBuilder, o que você achar melhor) o que tem no JTextArea. Faça um for, de 0 até o tamanho daquela String (que vai ser o texto inteiro). Dentro desse for, use o getCharAt(i), pra ver se existe, de fato, o ‘\n’. Quando existir, bingo!: você sabe que ocorreu uma quebra de linha, consequentemente, um índice de linha será incrementado. Você pode fazer um controle usando um HashMap (ou simplesmente um ArrayList ou vetor normal), onde a chave (no caso, se estiver usando ArrayList ou vetor, o índice deste) será o número da linha e o conteúdo, o código que tá naquela linha. Simples assim! 
Eu fiz um analisador léxico aqui. Não vou passar o fonte porque, como você disse, é um trabalho. Mas vamos discutir suas ideias! Isso sim pode gerar uma discussão legal 
Abraço!
Opa! Pergunta massa!Então… essa lógica que você diz são os padrões, certo? (Ou seja, o que é palavra reservada, o que é sinal de operação, mimimi). Essa parte você já fez? O JTextArea que você referiu é onde vão as regras?
Exatamente… mas estou em duvida se criou com uma conexao via banco( postgree) ou faço uma classe…
entao no JTextArea como vc sabe a pessoa ira digitar a linah de comandos padroes definido e no final tera que mostrar os padroes… e o que nao é…
alem disso no final tera que mostrar em qual linha e colouna este comando padrao… que é o token…
abraçoi!
Oi,
Eu fiz uma vez todos os analisadores! acho que tenho alguns escondidos na maquina rsrs
Para fazer uma numeração em sua JTextArea, poderá usar o código:
http://www.guj.com.br/posts/list/123003.java
Você deverá ter em uma Lista com todas as palavras reservadas e token!
percorrer exatamente caracter por caracter e verificar as situações!
Pelo que eu me lembro, o Lexico não mostrava a linha e o erro! apenas o Analisador Sintatico!
Tchauzin!
Oi,Eu fiz uma vez todos os analisadores! acho que tenho alguns escondidos na maquina rsrs
Para fazer uma numeração em sua JTextArea, poderá usar o código:
http://www.guj.com.br/posts/list/123003.java
Você deverá ter em uma Lista com todas as palavras reservadas e token!
percorrer exatamente caracter por caracter e verificar as situações!Pelo que eu me lembro, o Lexico não mostrava a linha e o erro! apenas o Analisador Sintatico!
Tchauzin!
Entao o que foi passado pra mim devera mostrar em que linha e coluna que esta o token…
entao seria desnecessario fazer via banco neh…
Tchau
Banco de dados? Não precisa não.
Eu criei umas classes, as quais eu chamava de FactoryAlgumaCoisa. Então tinha, por exemplo, as palavras reservadas eram criadas na classe FactoryPalavrasReservadas, que tinha um ArrayList de Strings, representando as palavras reservadas. Aí, quando necessário, eu acessava essa classe, fosse necessário para consultar, adicionar eu remover as palavras-chave.
Sobre a coluna, basta manter um índice do char em que você se encontra atualmente.
Na verdade, isso é bem relativo. No meu analisador, mostrava o erro que o Analisador Léxico deve mostrar (um caracter inválido como ^, por exemplo) (nada redundante a frase, né?). Acho que todas as fases são importantes e detectam erros (inclusive o Léxico, que é o mais simplesinho).
cara se for possivel vc postar o que vc fezz…
pois estou meio perdido nisso cara!!
Pois então jovem… É gigantesco o código. Vou colocar um trecho dele:
char caracterAtual;
String palavraAtual = "";
linhaAtual = 1;
for (int indice = 0; indice < codigo.length(); ++indice) {
caracterAtual = codigo.charAt(indice);
if (caracterEstranho(caracterAtual)) {
erros.add("" + caracterAtual);
}
else if ((caracterAtual == ' ') || (caracterAtual == '\n') || (caracterAtual == '\t')) {
if (caracterAtual == '\n') {
linhaAtual++;
}
if (palavraAtual.length() > 0) {
processaPalavra(palavraAtual);
}
palavraAtual = "";
} else if (caracterAtual == '"') {
palavraAtual = "" + caracterAtual;
for (int outroIndice = (indice + 1); outroIndice < codigo.length(); ++outroIndice) {
if (codigo.charAt(outroIndice) == '"') {
indice = outroIndice;
palavraAtual += "";
break;
} else {
palavraAtual += "" + codigo.charAt(outroIndice);
}
}
System.out.println("Adicionando literal: " + palavraAtual);
literais.add(palavraAtual);
palavraAtual = "";
} else {
palavraAtual += caracterAtual;
}
}
Esse daí é o ‘core’ dele.
Aí as factories que eu criei funciona assim: dentro de cada um existe um ArrayList. Quando clicar no botão de adicionar, adiciona um novo lexema lá. O mesmo acontecer com o remover. A partir disso, e desse ‘core’, fica fácil ver que é só percorrer o texto e verificar o que é a palavra (ou caracter) que está na vez. Se for espaço, temos uma palavra, pra verificar o que ela é (se é símbolo, operador, número, palavra-chave).
Esqueci de falar, mas um dos erros que tinha no meu analisador era que não podiam ter palavras que começassem com números e tivessem letras na frente (exceto pelo E). Isso é um erro que o léxico deve detectar também.
Entao esse core é outra classe que vc fez??
eu estou fazendo na 1° panel
tem uma jTextArea
2 jbutton,
no segundo jbutton vai chamar pra outra tela!
estou perdido em qual eu tenho q criar essa linha de comando…
se é necessario crirar uma nova classe…
vc conssegueria me explicar cara…
sou um pouko novo entao preciso de ajudas…
Esse core é o analisador léxico.
Linha de comando você diz a área onde o usuário vai digitar o código?
Acho que sua dúvida tem mais a ver com Swing do que com compiladores. Tenta explicar melhor aí pra gente.
Entao cara é assim
Foi passado pra mim desenvolver um analisador Lexico …
nesse Analisador eu tenho q definir a linguagem padraoo, como um compilador , sabe
entao , nesse analisador eu tenho q definir o que é token ( por ex: char, string, ; , {,} e etc) codigos padroes… e o que nao for tbm,que no caso seria um identificador.
No final ele devera mostrar o que é um e outro.
Eu estou penssado em fazer assim, definiria em uma classe tudo o que é token … certo, e a tela pra que o usuario monte um “programa”.No final o usuario clicará em um um botao ( RUN) , quando ele clicar devera abrir uma outra tela que ira mostrar tudo o que o que o usario digitou que é token e o que nao tbm…
BOm é isso cara o que tenho q fazer.
Como que eu leio o caracter do txt?
to usando isso:
caracterAtual = codigo.charAt(indice);
mas não ta dando certo.
===========================
Consegui fazer ler o caracterAtual assim
caracterAtual = (char) leitor.read();
o meu problema agora é com os espaços em branco… mas to olhando pra fazer com StringTokenizer