style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">

expresiones regulares javascript

hola chicos necesito hacer un programa que al escribir una funcion por ejemplo a = 2 - 4 esto se pueden separa de forma [0] = a , [1] = = [2] = 2 asi en secuncia pero que tambien me indique el tipo de dato que es por ejemplo [0] = a constante , [1] = = operador [2] = 2 numerico no se si me explique pero tambien que yo ponga if / else en una expresion cualquiera me diga el nombre no se como poder hacer que me salga el nombre de cada operador , constante , comprarador etc.. no se si me puedan dar una idea de como hacerlo...

AdjuntoTamaño
desccompone strings en un arreglo.html752 bytes

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.

Tienes que hacer un

Tienes que hacer un analizador léxico y un parser para ese analizador.

Esto se puede hacer en cualquier lenguaje, Javascript por ejemplo, para en este foro encontrarás más ayuda sobre Java (que es un lenguaje diferente)

Suerte

y como se hace un analizador

y como se hace un analizador lexico .... en general ....u otro metodo mas facil ..

Tomando cada carácter y

Tomando cada carácter y formando tokens, un token es un "algo" que tiene algún significado en tu lenguaje. Por ejemplo, los números podrían ser un tipo de token, las letras otro y los símbolos otro.

En tu ejemplo quieres formar los tokens:

a tipo: variable
= tipo operador
2 tipo: numero
- tipo: operador
4 tipo: numero

Entonces tienes que ir caracter por caracter y viendo si el caracter en turno forma parte o no de un tipo de token.

entrada: "a = 2 - 4"
La cadena se ve podría ver como un arreglo así:
[a][ ][=][ ][2][ ][-][ ][4]

Luego tienes que recorrer el arreglo, y ver si el elemento en turno es o no parte de tu token
por ejemplo el primer elemento de tu arreglo: [a] parece una letra, podrías formar el token "VARIABLE"

Lista tokens;
foreach c in input {
    if c == 'a' || c == 'b' .... c == 'z'  {
       lista.add(Token( c, Token.LETRA ))
    } else if c == '=', || c == '-', || c == ......
        lista.add(Token(c, Token.OPERADOR))
   }  else if c == ' ' {
        lista.add(Token.ESPACIO)
  .... etc. etc para todos los tipos de tokens que quieras soportar
  }

}

Y eso es todo, ese es el analizador léxico. Luego tienes que revisar si lo que está en el analizador es válido o no ( analizador semántico ) por ejemplo
la siguiente entrada podría no ser válida en tu lenguaje:

- 2 4 = a

Por que la variable esta del lado derecho en vez del izquierdo, pero puede también ser que en tu lenguaje eso sea una sintaxis válida, por ejemplo si aceptaras notación prefija.

bueno aqui el punto es que

bueno aqui el punto es que solo reconosca el tipo de operador, letra etc de cualquier funcion que pongasmos entonces...

este es mi codigo donde hace es funcion de separar cada variable...

entonces pienso yo que solo es poner algo asi como tu me das el ejemplo y no importa si es al reves osea que quede 4-2 = a solo es identificar la funcion..

function reconocer(){
var expresion = document.getElementById('expresion');
var resultado = document.getElementById('resultado');

var r= expresion.value.split(" ");
resultado.innerHTML="";

for (var i=0; i";
}

}

no se si el codigo o la explicacion anterior se pueda adaptar en este codigo... ??

Re: expresiones regulares

 

Tal vez quieras utilizar algunas otras expresiones regulares:

var array = expresion.innerHTML.split(/\s+/);
for (var i in array) {
    if (/^[a-z]$/.test(array[i])) {
        resultado.innerHTML = resultado.innerHTML + array[i] + " es constante<br>";
    } else if (/^[0-8]$/.test(array[i])) {
        resultado.innerHTML = resultado.innerHTML + array[i] + " es numerico<br>";
    } else if (/^[=-]$/.test(array[i])) {
        resultado.innerHTML = resultado.innerHTML + array[i] + " es operador<br>";        
    }
}

Ver demo.

~~~

si esta bien lo que pusiste

si esta bien lo que pusiste pero aqui es que tu puedas poner cualquier expresion sea a = 2 - 4 o if = 3 <= 2 etc ...
mira este es mi codigo completo ...

lo puse arriba en la

lo puse arriba en la descripcion...

Si, si se puede adaptar, de

Si, si se puede adaptar, de hecho es lo que jpaul te puso en su demo.

Tienes que definir que significa "cualquier" porque aunque sea obvio para tí, tu programa lo tiene que saber, por ejemplo if es una variable? dos (una llamada i y otra f) ? es un operador? etc. Que tal af? o fi?

En el programa que pusiste estás separando por espacios, por lo que fallaría si ingresas algo sin espacios, por ejemplo:

a=1+2

Entonces lo que puedes que hacer para separar en tokens es:

1.- Leer la entrada caracter por caracter. string.split() en javascript hace eso.
2.- Definir que cosa conforma en token y cuando termina un token y empieza otro. Generalmente los espacios y los operadores son delimitadores.
3.- Definir que tipos de token vas a soportar: números, identificadores, operadores, y listarlos.
4. - Crear un token y clasificarlo con la regla que tu pusiste
5.- Agregarlo a una lista (o arreglo) de tokens.

Estos pasos traducidos en pseudo-código serían algo como:

func lex() {
   token // el token en turno
   listaDeTokens //
   // 1. leer letra por letra
   for c in input {
      // 2. Definir que conforma un token:
       if ( c es espacio, o es operador o parentesis u otro delimitador ) {
           clasificar(token) // 3 y 4
           listaDeTokens.add( token ) // 5.
           token = nuevo token
       }
       // agregar c al token
        token = token + c
   }
}

// 3. definir que tipo de token es
func salvar( token ) {
    if token esta en lista de parabras reservadas ( if , else, while, for etc. ) {
        // 4. clasificarlo.
        token.tipo = RESERVADA
    } else if token empieza con letra {
        token.tipo = VARIABLE
    }  else fi token.empieza con numero {
       token.tipo = NUMERO
    } else if token.empieza con operador {
       token.tipo = OPERADOR
    }
}

El código final es obviamente mucho más largo y complejo que esto, pero intenta ir resolviendo cada punto uno por uno antes de intentar saltar al otro. Crea funciones para que no tengas toda la logica en una sola funcion que crezca y crezca sin control.

style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">