Léxico

Diagramas de Cromway

Los elementos del léxico de un lenguaje de programación es el conjunto de símbolos, palabras reservadas y reglas de construcción que se utiliza para poder crear nuevas palabras dentro de un lenguaje de programación. Este conjunto de elementos se conocen como tokens. Básicamente son símbolos de puntuación y operadores, representaciones de números y textos, así como nombres que identifican variables de un programa incluyendo: clases, atributos, métodos y variables en el caso de Java.

Siempre hay que tener en cuenta que existen algunos identificadores o palabras dentro de cada lenguaje que vienen definidos como parte del lenguaje, como lo haríamos en algún idioma o lenguaje natural. Este conjunto de palabras es muy reducido, en el caso de Java son menos de cien palabras que no pueden utilizarse porque indican declaraciones de clases, tipos de datos primitivos y estructuras de control. Comparado con el inglés, el español, el francés o cualquier otro lenguaje natural realmente son muy pocas palabras.

Para la definición de un lenguaje de programación se útilizan los diagramas sintácticos o diagramas de Conway, los cuales permiten ligar símbolos básicos para producir nuevas palabras, sentencias y estructuras más complejas dentro del lenguaje.

Los diagramas sintácticos tienen tres elementos, flechas que indican el inicio, el orden como se escriben los símbolos; símbolos terminales que se escriben tal cual aparecen en el diagrama y símbolos no-terminales que se definen en otro diagrama sintáctico.

Los símbolos teminales se representan con círculos o rectángulos de esquinas redondeadas y los no-terminales con rectángulos.

Por ejemplo, «dígito decimal» se define con un rectángulo e indica que el elemento se define en otro diagrama sintáctico que contenga símbolos terminales.

Símbolo no-terminal

También podrían ser las «letras minúsculas»:

Símbolo no-terminal

«Letras mayúsculas»:

Símbolo no-terminal

Y todas las «letras»:

Símbolo no-terminal

El diagrama sintáctico que define «dígito terminal», iniciando por el lado izquierdo, puede seguirse cualquiera de las flechas para colocar cualquiera de los diez dígitos decimales: 0, 1, 2, 3, …, 8 y 9; cada uno es un símbolo terminal que debe escribirse tal cual aparecen en el diagrama; después de escribir un dígito continua la lectura del siguiente carácter.

Símbolo terminal

También podrían ser las «letras minúsculas»:

Símbolo terminal

«Letras mayúsculas»:

Símbolo terminal

Los símbolos no-terminales se pueden utilizar para definir nuevos elementos, por ejemplo: el «dígito hexadecimal» que contiene símbolos terminales y no terminales:

Integración en otros diagramas

Identificadores

Los identificadores se utilizan para crear palabras nuevas dentro de un lenguaje de programación y así nombrar variables, clases, atributos, métodos, constantes y otros elementos definidos por el usuario. Java utiliza letras (principalmente del idioma inglés), números y el símbolo de guión bajo (“_”) mayúsculas y minúsculas. Ejemplos: Ecuacion, base, asignar, etc.

Para Java, los identificadores escritos con mayúsculas y minúsculas son distintos, así: ecuacion, Ecuacion, eCuaCioN son identificadores distintos o se referirán a entidades distintas porque hay distinción de mayúsculas y minúsculas, se dice que los identificadores son “case sensitive” o sensibles a mayúsculas y minúsculas.

Un «identificador» sigue el siguiente diagrama:

Java tiene algunas convenciones (que no son forzosas pero es deseable cumplirlas) para nombrar Clases, variables, atributos, métodos() y CONSTANTES, estos pueden consultarse en “Principios de la programación orientada a objetos”.

Ejercicio de selección

Indica si las siguentes propuestas cumplen con las reglas para ser identificadores:

i

Si, empieza con una letra y después no sigue nada.

gAtO

Todas son letras.

1dato

Los identificadores deben iniciar con una letra, el primer símbolo no puedes ser un número.

A1b2c3

Empieza con letra y llega intercaladas letras y números.

Un triangulo

Son todas letras, pero no se admite el espacio como parte del identificador.

  • Palabras reservadas

    Algunos identificadores no pueden utilizarse ya que forman parte del lenguaje de programación y se les identifica como palabras reservadas del lenguaje Java; por ello, no pueden utilizarse para nombrar variables, clases, métodos, atributos o algún otro nombre por parte de los programadores.

    Las palabras reservadas son muy pocas en comparación de un lenguaje natural (como español, inglés, francés, etc). Sirven para ejecutar sentencias y para modificar o potenciar las palabras básicas. A continuación aparecen estas palabras agrupadas de acuerdo a la aplicación que tienen dentro del lenguaje.

    En Java, los elementos disponibles para realizar cualquier tarea se agrupan clases. Cada clase tiene información y métodos que puede utilizarse en cualquier programa. Normalmente cada clase se escribe y se compila y quedan agrupados en una jerarquía de directorios que indica un “paquete” o grupo de clases que implica una jerarquía de la clases.

    import, package

    La palabra package indica en qué lugar de la jerarquía se colocarán las clases, y la palabra import se utiliza para indicar que se utilizará una clase o un conjunto de clases.

    La palabra package indica en qué lugar de la jerarquía se colocarán las clases, y la palabra import se utiliza para indicar que se utilizará una clase o un conjunto de clases.

    Declaración de una librería:

    Manejo de librerías

    Uso de una librería:

    Manejo de librerías

    Son los tipos de dato que no utilizan el mecanismo de clases, incluye números enteros, con punto decimal, booleanos (falso y verdadero), enumerados y caracteres. Estos tipos los incorpora Java para incrementar la velocidad y disminuir el uso de memoria al momento de realizar cálculos y almacenar los datos en la memoria de la compuradora, sin necesidad del mecanismo que implica la creación de la estructura de clases y objetos.

    • Enteros: byte, short, int, long

    • Con punto decimal: float, double

    • Booleano: boolean y las constantes true y false para asignarle valores.

    • Enumerados de constantes: enum

    • Caracteres Unicode: char

    • Sin tipo: void

    • Referencia sin asignar en memoria: null

    Las variables y atributos pueden utilizar alguno de los tipos de datos primitivos o clases o enumerados (enum) referenciadas por un identificador:

    Tipos de dato primitivos

    Puede consultarse los materiales de Tipos de dato y Codificación de expresiones aritméticas.

    public, private, protected

    La visibilidad se ocupa para indicar si los elementos de las clases están disponibles desde el exterior de un objeto. public es accesible desde el exterior, y private y protected no lo son.

    Visibilidad

    Aprenderás más en el material de Modificadores de acceso.

    class, extends, abstract, implements, interface

    Para la declaración de clases se utiliza la palabra reservada class seguido del nombre de la clase. Adicionalmente, se pueden utilizar extends para derivar o agregar elementos adicionales para especializar una clase.

    También pueden definirse una plantilla de clases o métodos con abstract e interface y definir estos elementos con la palabra implements.

    Aprenderás más en el material de Principios de la programación orientada a objetos y en Herencia y Polimorfismo.

    static, final

    static indica si un elemento (atributo o método) pertenece a una clase en vez de tener una copia en cada objeto de una clase. final indica que ya no puede modificarse. Ambos modificadores pueden usarse simultáneamente, individualmente o no ocuparse:

    Modificadores de atributos y métodos

    Aprenderás más en el material de Modificadores de acceso.

    new, this, super, instanceof

    Cuando se quiere una copia de una clase (instancia u objeto) en memoria, se utilizar la palabra new para crear un elemento nuevo, cada uno con sus propios atributos o información y compartiendo el código de los métodos.

    Referencia a elementos de una clase

    Dentro de la codificación de los métodos this y super se refieren, respectivamente, a un método o atributo que existe en la clase actual o en la superclase (ancestro). Es especialmente útil cuando se hace una sobrecarga o redefinición de métodos en una jerarquía de clases para identificar a cuál nos referimos, ya que cada clase tiene acceso tanto a los objetos que redefine como a los de las superclases.

    Referencia a elementos de una clase

    La palabra instanceof funciona como un operador binario que puede regresar valor booleano. Si la clase que se escribe a la izquierda, que es un objeto o instancia es del tipo der dato clase que se encuentra a la derecha, regresará true y si no pertence a la jerarquia regresa false.

    Referencia a elementos de una clase
  • Estructuras de control

    • Estas palabras, aunque se definen de forma aislada como en diccionario, van combinadas para formar estructuras de toma de decisiones:

    • Condicional simple y doble: if, else

    • Condicional múltiple: switch, case, default

    • Cíclicas: for, do, while

    • Interrupción de ejecución: return, break, continue

    Para sentencias condicionales puedes consultar: Estructuras condicionales y Estructuras repetitivas.

    Si (if) la expresión booleana es verdadera (true) se ejecuta la primera sentencia. De forma opcional, si la expresión resulta ser false (else) se ejecuta una segunda sentencia. Toda la estructura es una sentencia condicional simple o doble, dependiendo de la inclusión de else.

    if-else

    Conmuta (switch) a distintos bloques de código considerando que el valor en cada case sea Expresión=valor, y ejecuta una o varias sentencias; si no fue igual a los valores especificados en las sentencias case se va a otro bloque de sentencias default. El diagrama sintáctico de la «sentencia switch» es:

    switch

    Se conoce como una estructura de ciclo o «sentencia for». Consta de cuatro partes: se revisan las condiciones una variable de control a la que se le da un valor inicial con la «sentencia de inicio» mientras se cumpla la «expresión booleana» se ejecuta la «sentencia» de la estructura; una vez concluida ésta en cada ciclo, se ejecuta la «sentencia de incremento» y se verifica la «expresión booleana» para continuar la siguiente repetición.

    for

    Mientras se cumpla la «expresión booleana» se ejecuta la «sentencia» indicada dentro de la «sentencia while».

    while

    Se ejecuta la «sentencia» y se repite mientras se cumpla la «expresión booleana». La sentencia se ejecuta al menos una vez.

    do-while
  • Manejo de excepciones

    try, catch, finally, throw, throws

    Las palabras try, catch y opcionalmente finally se utilizan para intentar (try) ejecutar sentencias que pudieran generar un error esperando que no ocurra. Sin embargo uno o varios bloques atraparán (catch) el error e intentarán resolverlo para evitar que el programa termine inesperadamente. Finalmente (finally) se pueden dar sentencias generales después de la ejecución del bloque try-catch.

    En un bloque de código la palabra throw “lanza” una excepción ante un determinado error. El método que hizo la llamada deberá encargarse de atrapar (catch) el error e intentar resolverlo, o bien será una causa de término abrupto en la ejecución del programa. La palabra throws advierte a quien vaya a utilizar un método que éste puede generar un error, forzándolo a que la llamada utilice un bloque try-catch.

    Para un manejo básico puedes consultar Verificación de excepciones con estructuras condicionales .

    Sentencia que se utiliza para “lanzar” o iniciar una excepción:

    throw

    Sentencia que se utiliza para indicar que un método puede iniciar una excepción:

    throws

    Intenta (try) la ejecución del bloque de sentencias de prueba asumiendo que no habrá errores. Si alguna sentencia genera un error, catch atrapará el tipo el tipo de error de cada una de las clases de indicadas y tratará de recuperarse del error. Finalmente, de manera opcional se ejecutará el bloque final (finally). Este es el diagrama sintáctico de la sentencia «try-catch»

    try-catch
  • Otros

    assert, native, synchronized, transient, export, module, non-sealed, open, opens, permits, provides, record, requires, sealed, to, transitive, uses, var, with, yield, volatile.

    Estas palabras reservadas se ocupan ocasionalmente y no se abordarán en este material. Es conveniente conocerlas porque no podrán utilizarse como identificadores dentro de cualquier clase o programa en Java.

    goto, const, strictfp

    Estas palabras reservadas ya no se ocupan aunque aún aparecen como reservadas y no podrán utilizarse como identificadores dentro de cualquier clase o programa en Java.

Ejercicio de selección

Indica si los siguientes identificadores son palabras reservadas:

while

Es una palabra reservada para estructuras cíclicas.

While

Se parece a la palabra reservada while, sin embargo, al iniciar con mayúscula no corresponde porque en Java hay distinción de mayúsculas y minúsculas para los identificadores.

double

Es un identificador de un tipo de dato primitivo.

Clase

No es una palabra reservada, además inicia con mayúscula.

default

Palabra reservada para que se ejecutara un bloque de instrucciones dentro de una estructura condicional múltiple (switch) cuando no corresponde a valores determinados en sentencias case.