domingo, 13 de marzo de 2011

Sistema Experto

Un sistema experto o sistema basado en el conocimiento es un sistema informático capaz de emular las prestaciones de un experto humano en un área concreta de conocimiento especializado. Más concretamente, el sistema experto debe ser capaz de llevar a cabo las siguientes tareas:
Aceptar las consultas que el usuario realice acerca de una situación dada del mundo real.
Aceptar los datos proporcionados por el usuario acerca de esta situación, y solicitar otros datos que el sistema estime relevantes.
Procesar esta información, en busca de una respuesta a la consulta planteada.
Emitir la respuesta hallada, que debe ser análoga en la mayor parte de los casos a la respuesta que daría un experto humano.
Justificar la respuesta finalmente emitida, siempre que el usuario así lo solicite.

CONSTRUCCIÓN DE UN SISTEMA EXPERTO


Fase 1 Selección de la Aplicación

Fase 2 Selección de la Herramienta de desarrollo del Sistema Experto

Fase 3 Diseño de ingeniería y construcción del prototipo

Fase 4 Integración y Mantenimiento en régimen de producción





Aplicaciones


Medicina, Economía, Psicología, Finanzas, Derecho y prácticamente todas las ramas del conocimiento.

Google lanza un servicio para encontrar víctimas del terremoto en Japón

Este servicio es una herramienta para encontrar a las víctimas del terremoto y posterior tsunami que devastaron Japón el viernes.
La herramienta contiene, "buscador de personas" en inglés y japonés que permite a los usuarios pedir y proveer información sobre individuos

http://espanol.news.yahoo.com/s/afp/110312/tecnologia/jap__n_sismo_internet

viernes, 11 de marzo de 2011

La próxima versión de Ubuntu se llamará «Oneiric Ocelot»

La elección final ha sido “Oneiric Ocelot”. La parte “onírica” del nombre se explica por sí sola, pero el ocelote indica un regreso a la referencia de felinos, algo que Ubuntu ya ha hecho en el pasado (Lucid Lynx), y que también es práctica de Apple para su sistema OS X.
http://www.abc.es/20110310/tecnologia/abci-ubuntu-oneiric-ocelot-201103101524.html

viernes, 11 de febrero de 2011

Microsoft asegura que Internet Explorer 9 es más rápido que Firefox y Chrome

Microsoft ha confirmado que su versión definitiva de Internet Explorer 9 será un 35 por ciento más rápida que la versión beta actualLa compañía está convencida de que este incremento de las prestaciones convierte a su navegador en el más rápido del mercado. Microsoft también ha destacado que las posibilidades de privacidad de Internet Explorer 9 harán que su sistema esté un paso por delante respecto a sus competidores.

http://www.hoytecnologia.com/noticias/Microsoft-asegura-Internet-Explorer/267643

Antec Rockus 3D, nuevo sistema de altavoces

El sistema de altavoces Antec Rockus 3D no solamente se ve algo extraño, sino también que nos brindará toda la energía y el realismo del sonido 3D junto a la claridad y precisión de un audio de alta calidad.

http://tecnomagazine.net/2011/02/11/antec-rockus-3d-nuevo-sistema-de-altavoces/

jueves, 3 de febrero de 2011

Windows 8 llegará en 2011

Después de que Microsoft lanzara al mercado Windows 7 en octubre de 2009, Bill Gates parece estar preparado para lanzar Windows 8
Julio del 2011
http://misnoticias.zobyhost.com/?p=914

Toshiba Dynabook Qosmio T750, una estupenda laptop que cambia de color 0

Seguramente no crees lo que dice en el título, pues entonces échale un vistazo a la nueva Toshiba Dynabook Qosmio T750 cuando llegue a una tienda de tu ciudad. Toshiba ha diseñado un modelo innovador que cambia de color cuando se ve desde distintos ángulos.

http://tecnomagazine.net/

Adiós a las direcciones IPv4 Adiós a las direcciones IPv4

El anuncio de esta tarde suena apocalíptico, y de hecho cambiará la estructura de internet, aunque los usuarios y muchos operadores aún no hayan percibido la magnitud del problema. La Agencia de Asignación de Números de Internet (IANA) ha entregado hoy simbólicamente, en un acto celebrado en Miami, las últimas direcciones IP disponibles en el mundo (en la práctica, las concesiones se enviaron vía mail hace un par de semanas).
http://www.hoytecnologia.com/noticias/Adios-direcciones-IPv4/262361

miércoles, 2 de febrero de 2011

JAVACC y ANTLR

¿Qué es y cómo funciona ANTLR?

ANTLR es un programa está escrito en java, por lo que se necesita alguna máquina virtual de java para poder ejecutarlo. Es software libre, lo que quiere decir que al descargarlo de la página oficial (http://www.antlr.org) obtendremos tanto los ficheros compilados *.class como el código fuente en forma de ficheros *.java. ANTLR es un generador de analizadores. Mucha gente llama a estas herramientas compiladores de compiladores15, dado que ayudar a implementar compiladores es su uso más popular. Sin embargo tienen otros usos. ANTLR, por ejemplo, podría servir para implementar el intérprete de un fichero de configuración

ANTLR es capaz de generar un analizador léxico, sintáctico o semántico en varios lenguajes (java, C++ y C# en su versión 2.7.2) a partir de unos ficheros escritos en un lenguaje propio. Dicho lenguaje es básicamente una serie de reglas EBNF y un conjunto de construcciones auxiliares.

ANTLR genera analizadores pred-LL(k), y él mismo utiliza un analizador pred-LL(k) para leer los ficheros en los que están escritas las reglas EBNF. ANTLR admite acciones en sus reglas, además de otras prestaciones como paso de parámetros, devolución de valores o herencia de gramática




Especificación de gramáticas con ANTLR

Los ficheros con los que trabaja ANTLR tienen la terminación *.g, y en adelante los llamaremos ficheros de especificación de gramáticas o, directamente, ficheros de gramáticas.

Un fichero de gramática contiene la definición de uno o varios analizadores. Cada uno de estos analizadores se traducirá a código nativo (java, C++ o C#, dependiendo de ciertas opciones) en forma de clases. Es decir, por cada analizador descrito en el fichero de gramáticas se generará una clase.

Todo fichero de gramática tiene la siguiente estructura:

header{
/* opciones de cabecera */
}
options
{
/* opciones generales a todo el fichero */
}
// A continuación la definición de el(los) analizadore(s).


Cabecera: Esta zona es opcional (puede aparecer o no). Delimitada por las partículas “header {” y “}”, en esta zona incluimos elementos en código nativo (java, C++ o C#) que deben preceder a la definición de las diferentes clases de los analizadores. Esta sección se utiliza para incluir otros ficheros (import e #include), definir el paquete al que pertenecerá la clase del analizador (package) etc.

Opciones generales del fichero: Esta zona es opcional. Permite controlar algunos parámetros de ANTLR mediante “opciones”. Las opciones se representan como asignaciones : nombreOpcion=valor;. Se utilizan mucho en ANTLR. Las opción más importante de esta zona es la que permite elegir el lenguaje nativo en el que se generarán los analizadores (java,C++,C#). Su valor por defecto es “java”. Dado que vamos a generar reconocedores en java, no necesitaremos esta zona. En el manual de ANTLR aparecen todas las opciones que se pueden incluir en esta zona.

Tras las opciones generales del fichero vienen las definiciones de analizadores. Es muy común que en un mismo fichero se especifiquen varios analizadores (en la mayoría de los ejemplos que acompañan a ANTLR se utiliza esta técnica). Sin embargo también es posible definir cada analizador en un fichero, sobre todo cuando se trata de analizadores extensos16. Dado que nuestro lenguaje en este capítulo será muy sencillo, definiremos los tres analizadores en el mismo fichero.

En ANTLR, cada analizador tiene la siguiente estructura:

class nombreAnalizador extends tipoAnalizador; // definición del analizador

options {
/* Zona de opciones del analizador*/
}
tokens {
/* Zona de definición de tokens */
}
{
/* Zona de código nativo */
}
/* Zona de reglas */


Definición del analizador: En la primera línea definimos el nombre del analizador (nombreAnalizador) y su tipo (tipoAnalizador). El tipo puede será Lexer para analizadores léxicos, Parser para analizadores sintácticos y TreeParser para analizadores semánticos.



Zona de opciones:
Esta zona es opcional, aunque casi siempre interesa utilizarla. En esta zona se definen propiedades muy importantes del analizador: se define el lookahead (k), si se va a generar un AST o no, en el caso de Parsers y TreeParsers, la importación/exportación de vocabulario, la activación/desactivación del tratamiento automático de errores etc. Para más información consúltese el manual de ANTLR.

Zona de definición de tokens: Esta zona es opcional. Permite definir nuevos tokens, que se añaden a los que se hayan importado en la zona de opciones del analizador.

Zona de código nativo:

Zona de definición de reglas
: En esta zona se encontrarán las reglas que definirán la gramática.

Se admiten reglas EBNF extendidas (para más información sobre las reglas EBNF extendidas,

ANTLR utiliza un tipo de reglas que llamaremos EBNF extendidas. Las reglas EBNF extendidas se diferencian de las reglas EBNF en los siguientes aspectos:

• Pueden tener acciones

• Pueden tener predicados sintácticos y semánticos
• Pueden empezar con una acción, para declaración de variables locales.
• Los elementos de la regla son utilizables en el cuerpo de las acciones, y para ello se utilizan
“etiquetas”.
• Pueden devolver valores
• Pueden tomar parámetros
• Pueden codificar rangos de caracteres en el analizador léxico
• Pueden codificar patrones árbol en el analizador semántico

La zona de código nativo


No hay que olvidar que para ANTLR cualquier analizador es una instancia de una clase. En ocasiones es muy útil declarar métodos y atributos para dicha clase.

Para añadir métodos y variables a una clase de un analizador basta con escribirlos, entre la zona de opciones y la zona de reglas, entre llaves. Por ejemplo,

class MyParser extends Parser; // definición de un analizador sintáctico
options {...}
tokens {...}
{
private String a= “Hola ”; // atributo privado
public void imprimir(String s) // método público
{ System.out.println(s); }
}
regla1 : i:IDENT { imprimir(i.getText()); } ;
regla2 : e:ENTERO { imprimir(a+e.getText()); } ;

Los flujos de información

Flujo de caracteres


El primer flujo que voy a explicar es el que modela la entrada de datos desde el exterior hasta la primera fase del compilador, es decir, al analizador léxico. En otras palabras, voy a explicar qué es para ANTLR el flujo que en el primer capítulo llamé “Caracteres”.





Para ANTLR el flujo caracteres es, simplemente “cualquier subclase de java.io.InputStream”.

Lo más normal es utilizar un flujo de caracteres provinentes de un fichero (con un FileInputStream) pero pueden utilizarse otras fuentes, como una cadena (StringBufferStream) o una página web (URL.openStream). El InputStream que proporciona los caracteres al analizador léxico se le pasa como parámetro en su constructor.
Un pequeño inconveniente de utilizar éste método es que se pierde el concepto de “fichero”; los datos del fichero de texto perduran en forma de flujo FileInputStream, pero no ocurre así con el nombre del fichero. Éste puede ser especificado con la función setFilename:

// Convertir el nombre de fichero en un flujo
FileInputStream fis = newFileInputStream(fileName);
// Crear el lexer utilizando dicho flujo
LeLiLexer lexer = new LeLiLexer(fis);
// Proporcionar además el nombre de fichero al analizador
lexer.setFilename(f);


Flujo de Tokens

En éste caso estamos hablando del flujo de información existente entre el nivel léxico y sintáctico, es decir, el flujo que anteriormente hemos llamado “Tokens”.




La clase antlr.Token


Los tokens se representan en ANTLR utilizando una clase llamada antlr.Token. He aquí el código íntegro de dicha clase (salvo por algunos comentarios):

public class Token {
// constants
public static final int MIN_USER_TYPE = 3;
public static final int INVALID_TYPE = 0;
public static final int EOF_TYPE = 1;
public static final int SKIP = -1;
// each Token has at least a token type
int type=INVALID_TYPE;
// the illegal token object
public static Token badToken =
new Token(INVALID_TYPE, "");
public Token() {;}
public Token(int t) { type = t; }
public Token(int t, String txt) {
type = t; setText(txt);
}
public void setType(int t) { type = t; }
public void setLine(int l) {;}
public void setColumn(int c) {;}
public void setText(String t) {;}
public int getType() { return type; }
public int getLine() { return 0; }
public int getColumn() { return 0; }
public String getText() {...}
}


Esta clase está “casi vacía”; no hay una verdadera implementación de los métodos – están ahí para ser sobreescritos por una subclase.
A pesar de ser casi una interfaz, esta clase nos da una idea de cómo se tratan los tokens en ANTLR: un token es un “tipo” (un entero) un texto (una cadena) y una línea y columna (sendos enteros). Esta clase base garantiza que siempre que utilicemos un token en ANTLR podremos obtener estas informaciones.

La clase antlr.CommonToken

La clase antlr.Token por sí misma no es muy práctica debido a sus “métodos vacíos”. El analizador sintáctico no la utilizará directamente para representar los tokens; en su lugar se utiliza una subclase de antlr.Token llamada antlr.CommonToken. Su código es el siguiente:

public class CommonToken extends Token {
// most tokens will want line, text information
int line;
String text = null;
public CommonToken() {}
public CommonToken(String s) { text = s; }
public CommonToken(int t, String txt) {
type = t;
setText(txt);
}
public void setLine(int l) { line = l; }
public int getLine() { return line; }
public void setText(String s) { text = s; }
public String getText() { return text; }
}


Esta clase no hace más que rellenar los “huecos” que faltan en su superclase.
Uno de los “huecos” que CommonToken no implementa es la conservación del nombre de fichero (filename) en el token (CommonToken no tiene ningún atributo llamado “filename”, y los métodos getFilename y setFilename no hacen nada o devuelven null).

La interfaz antlr.TokenStream


La clase antlr.CharScanner (de la que heredan los analizadores léxicos que hacemos en ANTLR) implementa la interfaz antlr.TokenStream. El código completo de esta interfaz es el siguiente:

package antlr;
/* ANTLR Translator Generator
* Project led by Terence Parr at http://www.jGuru.com
* Software rights: http://www.antlr.org/RIGHTS.html
*
* $Id: //depot/code/org.antlr/main/main/antlr/TokenStream.java
*/
public interface TokenStream {
public Token nextToken() throws TokenStreamException;
}

Así que lo único que tiene que hacer el analizador sintáctico es ir llamando al método nextToken del analizador léxico.

Construyendo y ejecutando el analizador

Por eso el constructor principal de cualquier analizador sintáctico generado por ANTLR toma como único parámetro un objeto que cumpla la interfaz antlr.TokenStream. Por ejemplo, nuestro analizador léxico:

// Crear un analizador sintáctico utilizando el léxico
LeLiParser parser = new LeLiParser(lexer);


Como ocurría anteriormente, el nombre del fichero es irrecuperable por el Ç analizador, con lo que de nuevo es necesario pasárselo al analizador:

// Proporcionar el nombre del fichero al analizador sintáctico
parser.setFilename(fileName);


Una consecuencia muy interesante de esta arquitectura es que podemos utilizar cualquier clase que implemente la interfaz antlr.TokenStream como analizador léxico; si no nos gusta la implementación con autómatas LL del analizador léxico, podemos utilizar nuestra propia implementación. Bastará que cumpla la interfaz para poder pasársela al analizador sintáctico en la construcción.
Para que un analizador sintáctico comience a analizar una entrada, es necesario llamar explícitamente al método de la primera clase que se ha declarado. A dicha clase también se le llama “regla inicial” o “regla raíz”.

Si la regla raíz de nuestro compilador se llama “programa”, entonces para iniciar el análisis sintáctico sobre una entrada será necesario escribir algo así:

parser.programa();

En ese momento el analizador sintáctico comenzará a pedir tokens al analizador léxico, haciendo que éste a su vez comience a consumir caracteres de la entrada.




CONCLUSIONES

Sobre ANTLR
Al comenzar a trabajar con ANTLR pensaba que las principales dificultades que tendría serían derivadas de implementar un analizador léxico con un autómata recursivo descendente. Más tarde constaté que la mayoría de las dificultades que pueden presentarse durante el análisis léxico se resolvían bastante bien con las “ayudas” que ANTLR proporciona en el análisis léxico: reglas EBNF, tratamiento de literales, tratamiento de mayúsculas y minúsculas, rangos de caracteres...

Incluso superaba a flex en algunos aspectos, como la compatibilidad con Unicode y la posibilidad de generar código para varios lenguajes.

El análisis sintáctico, por su parte, resultó muy cómodo: habiendo comprendido el fundamento de pred-LL(k) durante el análisis léxico, resultó muy sencillo adaptarse a los flujos de tokens.

La recuperación de errores, por su parte, fue un poco más complicada de comprender. Cuando uno ha trabajado con Bison, adaptarse a que “solamente se puede reconocer una regla cada vez” es complicado. Finalmente dominé la recuperación de errores con un enfoque práctico: observando los cambios que se producían en el código generado, a la sazón bastante inteligible.

Aprender a crear el AST fue aproximadamente tan complicado como implementar la recuperación de errores; después hubo que implementar la creación del AST, con lo que podemos concluir que la mayor parte del tiempo de desarrollo con ANTLR se emplea en la creación y manejo del AST.

¿Merece la pena ANTLR?
¡Sí!

A pesar de las carencias, el balance total es muy positivo. El código que genera, aunque no es el más rápido, es muy robusto y comprensible. Es una solución más avanzada que el binomio bison+flex (permite crear y recorrer ASTs).
Quizás queda un poco atrás en el apartado de la eficiencia. Conforme aumente la velocidad de los procesadores esta diferencia se irá haciendo cada vez más pequeña, pero en algunos casos en los que se necesite procesar rápidamente una cantidad alta de datos podría resultar insuficiente.

En el ámbito académico, sin duda ANTLR es muy adecuado: su sencillez facilita el aprendizaje.

http://www.worldlingo.com/ma/enwiki/es/ANTLR

http://www.lsi.us.es/~troyano/documentos/guia.pdf
http://www.worldlingo.com/ma/enwiki/es/ANTLR



JAVACC





El generador JavaCC (Java Compiler Compiler) es una herramienta para generar analizadores de lengua¬jes; acepta como entrada una especificación de un determinado lenguaje y produce como salida un analiza¬dor para ese lenguaje; el analizador generado está escrito en Java. La especificación proporcionada al gene¬rador JavaCC puede contemplar distintos aspectos del lenguaje para el que se quiere obtener el analizador.

CARACTERÍSTICAS DE JAVACC


JavaCC integra las funciones de análisis léxico y análisis sintáctico en una sola herramienta, obteniendo a la salida código java –a diferencia de lex/yacc cuya salida es código C-.

- Características lexicográficas y sintácticas

es la forma más frecuente de uso del generador; la especificación proporcionada define las característi¬cas sintácticas y lexicográficas de un lenguaje y se genera un analizador léxico-sintáctico del lenguaje especificado.

- Características lexicográficas

en la especificación proporcionada al generador sólo se definen características lexicográficas del lengua¬je; con el código generado se puede obtener un analizador lexicográfico.

- Características lexicográficas y sintácticas y comprobaciones semánticas

También es posible completar una especificación léxico-sintáctica con la inclusión de código Java com¬plementario para que el programa generado (que incorpora adecuadamente ese código auxiliar) pueda hacer un análisis completo (léxico, sintáctico y semántico) del lenguaje especificado.

FUNCIONAMIENTO:

El funcionamiento de la herramienta consiste en analizar un fichero de entrada, que contiene la descripción de una gramática, y generar un conjunto de ficheros de salida, escritos en Java, que contienen la especificación de un analizador léxico y de un analizador sintáctico para la gramática especificada.
Estructura de un programa en JavaCC
Como puede verse en el ejemplo propuesto, la estructura básica de un programa JavaCC es:



options {
Área de opciones
}
PARSER_BEGIN(NombreClase)
Unidad de compilación Java con la clase de nombre Nombreclase
PARSER_END(NombreClase)
Área de tokens
Área de funciones BNF


El área de opciones permite especificar algunas directrices que ayuden a JavaCC a generar analizadores léxico-sintácticos bien más eficientes, bien más adaptados a las necesidades concretas del desarrollador.

En el ejemplo se ha indicado que, por defecto, la gramática indicada es de tipo LL(1), excepto si, en algún punto, se indica otra cosa.

Las cláusulas PARSER_BEGIN y PARSER_END sirven para indicarle a JavaCC el nombre de nuestra clase principal, así como para englobar tanto a ésta como a cualesquiera otras que se quieran incluir de apoyo, como pueda ser p.ej. un gestor de tablas de símbolos. En el ejemplo puede observarse que la clase principal constituye el analizador sintáctico en sí ya que la función main() crea un objeto de tipo Ejemplo a la vez que le pasa como parámetro en el constructor la fuente de la que se desea consumir la entrada: el teclado (System.in).

La clase creada por JavaCC incorporará una función por cada no terminal del área de reglas. Cada función se encargará de consumir la parte de la entrada que subyace debajo de su no terminal asociado en el árbol sintáctico de reconocimiento. Por tanto, asumiendo que el axioma inicial es listaExpr, una llamada de la forma miParser.listaExpr() consumirá toda la entrada, si ésta es aceptable.

Las siguientes dos áreas pueden mezclarse, aunque lo más usual suele ser indicar primero los tokens y finalmente las reglas en BNF, especialmente por motivos de claridad en el código.
En el ejemplo se han indicado tokens de dos tipos. Los tokens agrupados bajo la cláusula SKIP son aquellos que serán consumidos sin ser pasados al analizador sintáctico; en nuestro caso son: el espacio, el tabulador, el retorno de carro (CR-Carry Return) y la alimentación de línea (LF-Line Feed). Los tokens bajo la cláusula TOKEN constituyen los tokens normales, aunque el desarrollador también puede indicar este tipo de tokens en las propias reglas BNF, como ocurre con los patrones "(", ")", ";", etc. La declaración de cada token se agrupa entre paréntesis angulares y está formada por el nombre del token seguido por el patrón asociado y separado de éste por dos puntos. Los patrones lexicográficos se describen de forma parecida a PCLex. El ejemplo ilustra el reconocimiento de un identificador formado sólo por letras (ya sean mayúsculas o minúsculas merced al modificador

[IGNORE_CASE] de la cláusula TOKEN) y de un número entero.

La última área del ejemplo ilustra la creación de tres no terminales y sus reglas BNF asociadas. Dado que cada no terminal va a ser convertido por JavaCC en una función Java, su declaración es idéntica a la de dicha función y está sujeta a las mismas restricciones que cualquier otra función en Java. El cuerpo de cada una de estas funciones será construido por JavaCC y tendrá como propósito el consumo adecuado de tokens en base a la expresión BNF que se indique en la especificación.

La notación BNF empleada hace uso del símbolo * que representa repetición 0 ó más veces, + para la repetición 1 ó más veces, | para la opcionalidad, paréntesis para agrupar, etc. Los terminales pueden indicarse de dos formas, bien colocando entre paréntesis angulares alguno de los declarados en la fase anterior, o bien indicando su patrón directamente si éste está formado por una cadena constante de caracteres (realmente, JavaCC permite cualquier expresión regular, pero ello no resulta útil para nuestros propósitos). En el ejemplo es de notar la inclusión del carácter "@" en los terminales ad hoc NEW y ALGO, ya que, en caso contrario serían considerados identificadores al encajar por el patrón del token ID. Los patrones "NEW" y "ALGO" habrían sido correctamente reconocidos si el token ID se hubiera declarado después de la aparición de éstos en las reglas BNF.

http://www.lcc.uma.es/~galvez/theme/IntroduccionAJavaCC.pdf
http://www.giaa.inf.uc3m.es/docencia/II/PL2/herramientas/JFlex_JavaCC.pdf

lunes, 31 de enero de 2011

DEFINICION DIRIGIDA POR LA SINTAXIS

DEFINICIÓN DIRIGIDA POR LA SINTAXIS

@ Una definición dirigida por la sintaxis es una generación de una gramática independiente del contexto en la que cada símbolo gramatical tiene un conjunto de atributos asociados, divididos en los subconjuntos llamados atributos sintetizados y atributos herederos de dicho símbolo gramatical.

@ Un atributo puede representar cualquier cosa: una cadena, un numero, un tipo, una posición en memoria, etc. El valor de un atributo en nodo de un árbol de análisis sintáctico es definido a partir de una regla semántica asociada a la producción que esta utilizando dicho nodo. El valor de un atributo sintetizado en un nodo se calcula a partir de los valores de los atributos de los hijos de dicho nodo en el árbol d análisis sintáctico; el valor de un atributo heredado se calcula a partir de los valores de los atributos en los hermanos y el padre de dicho nodo.

@ Las reglas semánticas establecen las dependencias entre los atributos que serán representados mediante un grafo. Del grafo de dependencias se obtiene un orden de evaluación de las reglas semánticas y la evaluación de a las reglas semánticas definen los valores de los atributos en los nodos del árbol de análisis sintáctico para una cadena de entrada. Una regla semántica también puede tener efectos colaterales por ejemplo imprimir un valor o actualizar una variable global.

@ Las funciones de las reglas semánticas se escriben como expresiones; el único propósito de una regla semántica en una definición dirigida por la sintaxis es crear un efecto colateral. Dichas reglas se escriben como llamadas a procedimientos o
fragmentos de programa.

@ Se puede considerar como reglas que definen los valores de atributos sintetizados ficticios, del no terminal del lado izquierdo de la producción asociada, pues no muestra el atributo ficticio y el signo ( : = ) de las reglas semánticas.

NOTA : el operador || representa en las reglas semánticas la concatenación de las cadenas.

EJEMPLO



DEFINICIONES CON ATRIBUTOS SINTETIZADOS

Son una clase de definiciones dirigidas por sintaxis en la cual solo existen atributos sintetizados



Definiciones con Atributos por la Izquierda

Si la traducción ocurre durante el análisis sintáctico, el orden de evaluación de los
atributos se corresponde con el orden en el que se “crean” los nodos de un árbol
de análisis sintáctico
Un orden natural para los métodos de traducción descendente y ascendente es el
“orden de evaluación en profundidad”


viernes, 28 de enero de 2011

jueves, 27 de enero de 2011

* « Anterior * Siguiente » Baterías de papel que se recargan con la humedad del aire

En el juego de piedra-papel-tijeras hay que tener grandes dosis de perspicacia para averiguar qué material elegir.
ver más...........................
http://www.gizmodo.es/2011/01/27/baterias-de-papel-que-se-recargan-con-la-humedad-del-aire-veredicto-ya-no-se-respeta-ni-las-leyes-de-la-fisica.html

Microsoft, amigo los hackers

Las reacciones de Microsoft ante el hackeo de sus sistemas no paran de sorprender. La compañía ha visto como natural los desarrollos en Kinect, ha ofrecido un móvil leer más
http://www.abc.es/20110125/tecnologia/abci-microsoft-amigo-hackers-201101251254.html

Twitter le arrebató a Microsoft uno de sus principales científicos

La lista de colaboradores de Twitter desde esta semana tiene un agregado de honor. Se trata nada más y nada menos que de Alek Kolcz, el principal científico del motor de búsquedas Bing –propiedad de Microsoft–, quien emprendió un nuevo camino para sumarse a los más de 360 trabajadores de la red social, que ya superó los 200 millones de usuarios.

Leer más...............
http://www.enter.co/internet/twitter-le-habria-quitado-a-microsoft-uno-de-sus-principales-cientificos/

El desarrollador de Kinect se marcha a Google

Buscar o cambiar de trabajo parace algo complicado en los tiempos que corren. Pero si has inventado Kinect para Microsoft, te llueven las ofertas. Esto debe ser lo que le ha pasado al creador y desarrollador de Kinect, Johnny Chung Lee quien ha decidido abandonar Microsoft para incorporarse a Google.
Leer más......
http://www.noticiastecnologicas.com/

lunes, 17 de enero de 2011

Instalacion del juego princesa CriSi en linux mediante wine

Wine provee de:

* Un conjunto de herramientas de desarrollo para portar código fuente de aplicaciones Windows a Unix.
* Un cargador de programas, el cual permite que muchas aplicaciones para Windows 2.0/3.x/9X/ME/NT/2000/XP/Vista y Win 7 se ejecuten sin modificarse en varios sistemas operativos similares a Linux como GNU/Linux, BSD, Solaris y Mac OS X


Como – usar wine para instalar programas .exe en ubuntu linux.

http://arukard.wordpress.com/2008/04/26/como-usar-wine-para-instalar-programas-exe-en-ubuntu-linux/

Enlace de descarga del wine
http://wine.malavida.com/linux/

http://www.uptodown.com/ubuntu/buscar/descargar-wine-para-linux

Instalacion del juego princesa CriSi en linux mediante wine

Wine provee de:

* Un conjunto de herramientas de desarrollo para portar código fuente de
aplicaciones Windows a Unix.
* Un cargador de programas, el cual permite que muchas aplicaciones para Windows 2.0/3.x/9X/ME/NT/2000/XP/Vista y Win 7 se ejecuten sin modificarse en varios sistemas operativos similares a Linux como GNU/Linux, BSD, Solaris y Mac OS X

Como – usar wine para instalar programas .exe en ubuntu linux.

http://arukard.wordpress.com/2008/04/26/como-usar-wine-para-instalar-programas-exe-en-ubuntu-linux/

Enlace para descargar wine:
http://wine.malavida.com/linux/

Trailer de como jugar PrincesaCrisi

juego basado en Mario Bross
http://www.youtube.com/watch?v=av0VlD7Xfj0

miércoles, 12 de enero de 2011

Buscan que cada usuario de internet tenga un ID único

La idea viene de los Estados Unidos, que luego de la explosión de WikiLeaks, tomó conciencia acerca de los alcance de Internet. Ahora crearan una división del Ejército especializada en la web donde el primer plan es que cada usuario tenga un ID único

http://www.pergaminovirtual.com.ar/revista/cgi-bin/hoy/archivos/2010/00000300.shtml

jueves, 6 de enero de 2011

Intel ha presentado hoy sus nuevos procesadores Sandy Bridge

Los avanzados procesadores de Intel ofrecen mejor rendimiento con gráficos, alta velocidad para conversión de videos y un polémico sistema de protección anticopia.

Sin duda era una de las presentaciones estrella para esta edición del CES e Intel ha realizado una rueda de prensa multitudinaria de su nueva línea de procesadores para ordenadores de sobremesa y portátiles, que están especialmente diseñados para trabajar con video en alta definición y juegos.

http://www.theinquirer.es/2011/01/05/intel-ha-presentado-hoy-sus-nuevos-procesadores-sandy-bridge.html

LATEX

QUE ES LATEX

LaTeX está formado por un gran conjunto de macros de TeX, escrito por Leslie Lamport en 1984, con la intención de facilitar el uso del lenguaje de composición tipográfica, creado por Donald Knuth.

Es muy utilizado para la composición de artículos académicos, tesis y libros técnicos, dado que la calidad tipográfica de los documentos realizados con LaTeX es comparable a la de una editorial científica de primera línea.

LaTeX es software libre bajo licencia LPPL.

LaTeX es un sistema de composición de textos que está formado mayoritariamente por órdenes (macros) construidas a partir de comandos de TeX, un lenguaje «de bajo nivel», en el sentido de que sus acciones últimas son muy elementales, pero con la ventaja añadida, en palabras de Lamport, de «poder aumentar las capacidades de LaTeX utilizando comandos propios del TeX descritos en The TeXbook».

Esto es lo que convierte a LaTeX en una herramienta práctica y útil pues, a su facilidad de uso, se une toda la potencia de TeX. Estas características hicieron que LaTeX se extendiese rápidamente entre un amplio sector científico y técnico, hasta el punto de convertirse en uso obligado en comunicaciones y congresos, y requerido por determinadas revistas a la hora de entregar artículos académicos

Su código abierto permitió que muchos usuarios realizacen nuevas utilidades que extendiesen sus capacidades con objetivos muy variados, a veces ajenos a la intención con la que fue creado: aparecieron diferentes dialectos de LaTeX que, a veces, eran incompatibles entre sí.

Para atajar este problema, en 1989 Lamport y otros desarrolladores iniciaron el llamado «Proyecto LaTeX3». En otoño de 1993 se anunció una reestandarización completa de LaTeX, mediante una nueva versión que incluía la mayor parte de estas extensiones adicionales (como la opción para escribir transparencias o la simbología de la American Mathematical Society) con el objetivo de dar uniformidad al conjunto y evitar la fragmentación entre versiones incompatibles de LaTeX 2.09.

USO DE LATEX

LaTeX presupone una filosofía de trabajo diferente a la de los procesadores de texto habituales (conocidos como WYSIWYG, es decir, «lo que ves es lo que obtienes») y se basa en comandos.
Tradicionalmente, este aspecto se ha considerado una desventaja (probablemente la única).

Sin embargo, LaTeX, a diferencia de los procesadores de texto de tipo WYSIWYG, permite a quien escribe un documento centrarse exclusivamente en el contenido, sin tener que preocuparse de los detalles del formato.

Además de sus capacidades gráficas para representar ecuaciones, fórmulas complicadas, notación científica e incluso musical, permite estructurar fácilmente el documento (con capítulos, secciones, notas, bibliografía, índices analíticos, etc.), lo cual brinda comodidad y lo hace útil para artículos académicos y libros técnicos.

Con LaTeX, la elaboración del documento requiere normalmente de dos etapas:

En la primera hay que crear mediante cualquier editor de texto llano un fichero fuente que, con las órdenes y comandos adecuados, contenga el texto que queramos imprimir.


En la segundaConsiste en procesar este fichero; el procesador de textos interpreta las órdenes escritas en él y compila el documento, dejándolo preparado para que pueda ser enviado a la salida correspondiente, ya sea la pantalla o la impresora.

Ahora bien, si se quiere añadir o cambiar algo en el documento, se deberá hacer los cambios en el fichero fuente y procesarlo de nuevo. Esta idea, que puede parecer poco práctica a priori, es conocida a los que están familiarizados con el proceso de compilación que se realiza con los lenguajes de programación de alto nivel (C, C++, etc.), ya que es completamente análogo.

webgrafia
Sanguino Botella, Javier. Iniciación a LaTeX2e. Un sistema para preparar documentos, Madrid, Addison-Wesley, 1997. ISBN 84-7829-013-3
VV.AA., LaTeX, una imprenta en sus manos, Madrid, ADI, 2000.
VV.AA., El libro de LaTeX, Madrid, Pearson, 2003. ISBN 84-205-3779-9