@Iniciant escreveu:
preciso de uma ajudinha para achar o erro do analisador que estou criando, é um trabalho da faculdade, mas não consigo solucionar, alguém pode me ajudar ?
Segue em anexo o codico da classe Analisador
public class analiseLexico { /*Constantes de definição de tamanho*/ private static final int TAM_MAX_INT = 200000000; private static final int TAM_MIN_INT = -200000000; private static final float TAM_MAX_FLOAT = 30000000; private static final float TAM_MIN_FLOAT = -30000000; private static final int TAM_MAX_STRING = 128; private static final int NUM_EXPRESSOES = 57; private final String codigo; private final String expressoes; private final Pattern p; private Matcher matcher; public analiseLexico(String codigo) { this.expressoes = "(?<cod57>\n) | (?<cod1>write(?!\\w))|" + "(?<cod2>while(?!\\w))|(?<cod3>var(?!\\w))|" + "(?<cod4>then(?!\\w))|(?<cod5>string(?!\\w))|(?<cod6>senao(?!\\w))|(?<cod7>read(?!\\w))|" + "(?<cod8>procedure(?!\\w))|(?<cod9>or(?!\\w))| (?<cod10>of(?!\\w)) | (?<cod11>not(?!\\w))|(?<cod12>ninteiro(?!\\w))|" + "(?<cod13>nfloat(?!\\w))|(?<cod14>literal(?!\\w))|(?<cod15>integer(?!\\w))|(?<cod16>if(?!\\w))|" + "(?<cod17>ident(?!\\w))|(?<cod19>float(?!\\w))|" + "(?<cod20>fim(?!\\w))|(?<cod21>end(?!\\w))| (?<cod22>do(?!\\w))| (?<cod23>case(?!\\w))" + "(?<cod24>call(?!\\w)) | (?<cod25>begin(?!\\w))| (?<cod26>and(?!\\w))| (?<cod27>>=)|(?<cod28>>)|" + "(?<cod29>=)|(?<cod30><>)|(?<cod31><=)|(?<cod32><)|" + "(?<cod33>\\+)|(?<cod34>\\})|(?<cod35>\\{)|" + "(?<cod36>;)|(?<cod37>\\:\\=)|(?<cod38>:)|" + "(?<cod39>/)|(?<cod40>,)|(?<cod41>*)|" + "(?<cod42>\\()|(?<cod43>\\))|(?<cod45>\\-)"; this.codigo = codigo; p = Pattern.compile(expressoes); } public List<String> compila() { List<String> saida = new ArrayList<>(); String simbolo; /*Conjunto com todos os tokens encontrados*/ matcher = p.matcher(codigo); /*Variável que armazena a linha*/ int line = 1; while (matcher.find()) { for (int i = 1; i <= NUM_EXPRESSOES; i++) { if (i == 15 || i == 46 ||i == 40 || i == 45) { continue; } simbolo = matcher.group("cod" + String.valueOf(i)); if (simbolo != null) { //A partir do código 51, todos os seguintes são códigos somente para tratamento de erro switch (i) { case 47: //128 + os 2 caracteres de fechamento e abertura if (simbolo.length() > (TAM_MAX_STRING + 2)) { saida.add("Linha: " + line + " " + "ERRO: String maior que 128 caracteres"); } else { saida.add("Linha: " + line + " " + " [código:" + i + "]: " + simbolo); } break; case 48: int convertido; try { convertido = Integer.parseInt(simbolo); if (convertido < TAM_MAX_INT && convertido > TAM_MIN_INT) { saida.add("Linha: " + line + " " + " [código:" + i + "]: " + simbolo); } else { saida.add("Linha: " + line + " " + "ERRO: Inteiro maior que 200000000 ou menor que -200000000"); } } catch (NumberFormatException e) { saida.add("Linha: " + line + " " + "ERRO: Inteiro maior que 200000000 ou menor que -200000000"); } break; case 49: float f; try { f = Float.parseFloat(simbolo); System.out.println(f); if (f > TAM_MIN_FLOAT && f < TAM_MAX_FLOAT) { saida.add("Linha: " + line + " " + " [código:" + i + "]: " + simbolo); } else { saida.add("Linha: " + line + " " + "ERRO: Float maior que 30000000 ou menor que -30000000"); } } catch (NumberFormatException e) { saida.add("Linha: " + line + " " + "ERRO: Float maior que 30000000 ou menor que -30000000"); } break; case 50: saida.add("Linha: " + line + " " + "ERRO: & unitário"); break; case 51: saida.add("Linha: " + line + " " + "ERRO: Comentário de bloco (#*) não foi fechado (*#)"); break; case 52: saida.add("Linha: " + line + " " + "ERRO: Comentário de Bloco não foi aberto "); break; case 53: saida.add("Linha: " + line + " " + "ERRO: | unitário"); break; case 54: saida.add("Linha: " + line + " " + "ERRO: . unitário"); break; case 55: saida.add("Linha: " + line + " " + "ERRO: Declaração da string não foi fechada"); break; case 56: saida.add("Linha: " + line + " " + "ERRO: Literal não foi fechado"); break; case 46: line++; break; default: saida.add("Linha: " + line + " " + " [código:" + i + "]: " + simbolo); } } } } saida.add("Linha: " + line + " [código: 44]: $"); return saida; } }
Ele dá o seguinte erro:
Exception in thread "AWT-EventQueue-0" java.util.regex.PatternSyntaxException: Dangling meta character '*' near index 736
(?
) | (?write(?!\w))|(?while(?!\w))|(?var(?!\w))|(?then(?!\w))|(?string(?!\w))|(?senao(?!\w))|(?read(?!\w))|(?procedure(?!\w))|(?or(?!\w))| (?of(?!\w)) | (?not(?!\w))|(?ninteiro(?!\w))|(?nfloat(?!\w))|(?literal(?!\w))|(?integer(?!\w))|(?if(?!\w))|(?ident(?!\w))|(?float(?!\w))|(?fim(?!\w))|(?end(?!\w))| (?do(?!\w))| (?case(?!\w))(?call(?!\w)) | (?begin(?!\w))| (?and(?!\w))| (?>=)|(?>)|(?=)|(?<>)|(?<=)|(?<)|(?+)|(?})|(?{)|(?|(?\:\=)|(?:)|(?/)|(?,)|(?*)|(?()|(?))|(?-)
^
at java.util.regex.Pattern.error(Pattern.java:1955)
at java.util.regex.Pattern.sequence(Pattern.java:2123)
at java.util.regex.Pattern.expr(Pattern.java:1996)
at java.util.regex.Pattern.group0(Pattern.java:2852)
at java.util.regex.Pattern.sequence(Pattern.java:2051)
at java.util.regex.Pattern.expr(Pattern.java:1996)
at java.util.regex.Pattern.compile(Pattern.java:1696)
at java.util.regex.Pattern.(Pattern.java:1351)
at java.util.regex.Pattern.compile(Pattern.java:1028)
at compiladores.analiseLexico.(analiseLexico.java:47)
at compiladores.Tela.MenuItemActionPerformed(Tela.java:252)
at compiladores.Tela.access$100(Tela.java:16)
at compiladores.Tela$2.actionPerformed(Tela.java:172)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.AbstractButton.doClick(AbstractButton.java:376)
at javax.swing.plaf.basic.BasicMenuItemUI.doClick(BasicMenuItemUI.java:833)
at com.apple.laf.AquaMenuItemUI.doClick(AquaMenuItemUI.java:157)
Mensagens: 2
Participantes: 2