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.
También podrían ser las «letras minúsculas»:
«Letras mayúsculas»:
Y todas las «letras»:
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.
También podrían ser las «letras minúsculas»:
«Letras mayúsculas»:
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:
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”.
Indica si las siguentes propuestas cumplen con las reglas para ser identificadores:
-
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:
Uso de una librería:
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:
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.
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:
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.
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.
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.
-
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.
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:
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.
-
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 .
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»
-
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.
Indica si los siguientes identificadores son palabras reservadas: