SoloCodigo

Programación General => Java => Mensaje iniciado por: hackerdam en Lunes 29 de Febrero de 2016, 19:01

Título: Analizador lexico
Publicado por: hackerdam en Lunes 29 de Febrero de 2016, 19:01
Hola, estoy haciendo un analizador lexico.
Identifica, dada sierta cadena, que tipo de texto es: palabra reservada, operador, identificador, etc.

El problema es que si en el texto  que uso como expresion regular escribo el caracter "-" no me lo identifica como operador, sino que parece que se lo salta.

Les paso mi codigo acontinuacion:

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package analizadorlexico;

import java.util.regex.Matcher; //Encargada de leer el patron.
import java.util.regex.Pattern; //Encargada de definir el patron.


public class AnalizadorLexico {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
       
        String patron = ("(while)|([a-zA-Z]+)|([>|<|+|-|*|/|=]+)|([0-9]+)|([(|)]+)|([{|}]+)|(;)"); //Expresión regular.
       
        String texto = "while (x=0) < (y=0) + - *";   //Esta es la expresion regular
       
        Pattern p = Pattern.compile(patron);    //esto compila nuestra expresion regular.
        Matcher matcher = p.matcher(texto);
       
        while(matcher.find()){
           
            String tokenTipo1 = matcher.group(1);
            if(tokenTipo1 != null)
                System.out.println("palabra reservada: " + tokenTipo1);
       
               
            String tokenTipo2 = matcher.group(2);
            if(tokenTipo2 != null){
                System.out.println("Variables: " + tokenTipo2);
            }
               
            String tokenTipo3 = matcher.group(3);
            if(tokenTipo3 != null){
                System.out.println("Operador: " + tokenTipo3);
            }
               
            String tokenTipo4 = matcher.group(4);
            if(tokenTipo4 != null){
                System.out.println("Numero: " + tokenTipo4);
            }
               
            String tokenTipo5 = matcher.group(5);
            if(tokenTipo5 != null){
                System.out.println("Parentesis: " + tokenTipo5);
            }
               
            String tokenTipo6 = matcher.group(6);
            if(tokenTipo6 != null){
                System.out.println("Llaves: " + tokenTipo6);
            }
               
            String tokenTipo7 = matcher.group(7);
            if(tokenTipo7 != null){
                System.out.println("Simbolo: " + tokenTipo7);
            }
           
            }
       
        } //permite encontrar las coincidencias
    }

A que creen que se daba?
Muchas gracias por su ayuda.
Título: Re:Analizador lexico
Publicado por: arielb en Viernes 11 de Marzo de 2016, 19:33
Hola, el problema es que el guión lo está tomando como un caracter propio que es utilizado para definir un rango de caracteres.
Lo que puedes hacer es usar un escape de la siguiente manera \'-

saludos,