Quantcast
Channel: GUJ - Tópicos com a tag java
Viewing all articles
Browse latest Browse all 17410

Alguem me ajuda com esse analisador lexico?

$
0
0

@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))| (?>=)|(?>)|(?=)|(?<>)|(?<=)|(?<)|(?+)|(?})|(?{)|(?:wink:|(?\:\=)|(?:)|(?/)|(?,)|(?*)|(?()|(?))|(?-)
^
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

Ler tópico completo


Viewing all articles
Browse latest Browse all 17410

Latest Images

Trending Articles

<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>