segundo trabajo

14
Elementos léxicos y sintácticos Un lenguaje de programación es un idioma artificial diseñado para expresar computaciones que pueden ser llevadas a cabo por máquinas como las computadoras. Pueden usarse para crear programas que controlen el comportamiento físico y lógico de una máquina, para expresar algoritmos con precisión, o como modo de comunicación humana. Está formado por un conjunto de símbolos y reglas sintácticas y semánticas que definen su estructura y el significado de sus elementos y expresiones. Al proceso por el cual se escribe, se prueba, se depura, se compila y se mantiene el código fuente de un programa informático se le llama programación. Dentro de los elementos del lenguaje de programación hablaremos de léxico y sintaxis. Léxico Léxico es un lenguaje de programación didáctico en español que facilita el aprendizaje y la enseñanza de la programación orientada a objetos. A la forma visible de un lenguaje de programación se le conoce como sintaxis. La mayoría de los lenguajes de programación son puramente textuales, es decir, utilizan secuencias de texto que incluyen palabras, números y puntuación, de manera similar a los lenguajes naturales escritos. Por otra parte, hay algunos lenguajes de programación que son más gráficos en su naturaleza, 6

Upload: alberto-aguayo-lopez

Post on 14-Aug-2015

74 views

Category:

Education


1 download

TRANSCRIPT

Page 1: Segundo trabajo

Elementos léxicos y sintácticos

Un lenguaje de programación es un idioma artificial diseñado para expresar

computaciones que pueden ser llevadas a cabo por máquinas como las

computadoras. Pueden usarse para crear programas que controlen el

comportamiento físico y lógico de una máquina, para expresar algoritmos con

precisión, o como modo de comunicación humana. Está formado por un conjunto

de símbolos y reglas sintácticas y semánticas que definen su estructura y el

significado de sus elementos y expresiones. Al proceso por el cual se escribe, se

prueba, se depura, se compila y se mantiene el código fuente de un

programa informático se le llama programación.

Dentro de los elementos del lenguaje de programación hablaremos de léxico y

sintaxis.

Léxico 

Léxico es un lenguaje de programación didáctico en español que facilita el

aprendizaje y la enseñanza de la programación orientada a objetos. 

A la forma visible de un lenguaje de programación se le conoce como sintaxis. La

mayoría de los lenguajes de programación son puramente textuales, es decir,

utilizan secuencias de texto que incluyen palabras, números y puntuación, de

manera similar a los lenguajes naturales escritos. Por otra parte, hay algunos

lenguajes de programación que son más gráficos en su naturaleza, utilizando

relaciones visuales entre símbolos para especificar un programa.

Sintaxis 

La sintaxis de un lenguaje de programación describe las combinaciones posibles

de los símbolos que forman un programa sintácticamente correcto. El significado

que se le da a una combinación de símbolos es manejado por su semántica (ya

sea formal o como parte del código duro de la referencia de implementación).

Dado que la mayoría de los lenguajes son textuales, este artículo trata de la

sintaxis textual.

6

Page 2: Segundo trabajo

La sintaxis de los lenguajes de programación es definida generalmente utilizando

una combinación de expresiones regulares (para la estructura léxico. Este es un

ejemplo de una gramática simple:

expresión ::= átomo | lista

átomo ::= número | símbolo

número ::= [+-]?['0'-'9']+

símbolo ::= ['A'-'Z'<nowiki>'</nowiki>a'-'z'].*

lista ::= '(' expresión* ')' 

Constantes

En programación, una constante es un valor que no puede ser alterado durante la

ejecución de un programa. Corresponde a una longitud fija de un área reservada

en la memoria principal del ordenador, donde el programa almacena valores fijos.

El nombre de las constantes suele escribirse en mayúsculas en la mayoría de

lenguajes.

La palabra constante tiene en C++ dos connotaciones sutilmente diferentes

aunque relacionadas:

1.1 La primera es el sentido normal de la palabra constante en lenguaje natural; es

decir, datos (de cualquiera de los tipos posible) cuyos valores se han definido en el

momento de escribir el código del programa, y no pueden ser modificados más

tarde en tiempo de ejecución (lo que significa que sus valores deben ser resueltos

en tiempo de compilación). Dicho en otras palabras: el compilador sabe cuál es el

valor de los objetos declarados como constantes y en base a este conocimiento

puede hacer cuantas suposiciones sean válidas para conseguir la mayor eficiencia

en tiempo de ejecución.

En este sentido, el concepto constante es justamente el opuesto a variable, que

corresponde a aquellos objetos-dato que pueden recibir nuevas asignaciones de

valor a lo largo del programa. Dicho en otras palabras: entidades cuyo valor solo

es conocido en tiempo de ejecución.

1.2 La segunda connotación es la de tipo de objeto-dato. En este sentido podemos

afirmar que en C++ los enteros (variables) forman un tipo distinto de los enteros

7

Page 3: Segundo trabajo

constantes (constantes enteras), y que los caracteres (variables) forman un tipo

distinto de las constantes carácter. Así pues, distinguimos entre un tipo char y un

tipo const char. Como prácticamente todos los tipos de objeto-dato posibles en C+

+ puede declararse constantes, existe un universo de tipos C++, simétrico al de

los tipos de objetos variables, pero de objetos constantes.

Por ejemplo, un entero y una constante entera son tipos distintos y que una

constante entera C++ significa algo más que un entero al que no se le puede

cambiar su valor.

Lo que hace el compilador con los objetos declarados inicialmente como

constantes depende de la implementación. Esto significa que no está garantizado

que tales objetos tengan un Lvalue. Por ejemplo: en const int x = 5; no está

garantizado que el compilador le asigne a x un Lvalue, es decir, un espacio en

memoria determinado (que se permita modificar o no su valor es otra cuestión).

Puede ocurrir que, por razones de eficacia, sea simplemente una especie de

"define". Una especie de nemónico que hace que el compilador lo sustituya por un

5 en cada trozo de código donde aparezca x. Incluso en sitios donde aparezca

asociada a otras constantes puede estar resuelto el valor en tiempo de

compilación. Por ejemplo, si en otro sitio del programa aparece: const int z = 7; y

más tarde: int w = x + z + y; puede ocurrir que el compilador establezca

directamente: int w = 12 + y.

Por esta razón no está garantizado que el operador const_cast funcione con

objetos declarados inicialmente como constantes.

Variable

En programación, una variable está formada por un espacio en el sistema de

almacenaje (memoria principal de un ordenador) y un nombre simbólico

(un identificador) que está asociado a dicho espacio. Ese espacio contiene una

cantidad o información conocida o desconocida, es decir un valor. El nombre de la

variable es la forma usual de referirse al valor almacenado: esta separación entre

nombre y contenido permite que el nombre sea usado independientemente de la

información exacta que representa. El identificador, en el código fuente de la

8

Page 4: Segundo trabajo

computadora puede estar ligado a un valor durante el tiempo de ejecución y el

valor de la variable puede por lo tanto cambiar durante el curso de la ejecución del

programa. El concepto de variables en computación puede no corresponder

directamente al concepto de variables en matemática. El valor de una variable en

computación no es necesariamente parte de una ecuación o fórmula como en

matemáticas. En computación una variable puede ser utilizada en un proceso

repetitivo: puede asignársele un valor en un sitio, ser luego utilizada en otro, más

adelante reasignársele un nuevo valor para más tarde utilizarla de la misma

manera. Procedimientos de este tipo son conocidos con el nombre de iteración. En

programación de computadoras, a las variables, frecuentemente se le asignan

nombres largos para hacerlos relativamente descriptivas para su uso, mientras

que las variables en matemáticas a menudo tienen nombres escuetos, formados

por uno o dos caracteres para hacer breve en su transcripción y manipulación.

El espacio en el sistema de almacenaje puede ser referido por distintos

identificadores diferentes. Esta situación es conocida entre los angloparlantes

como "aliasing" y podría traducirse como "sobre nombramiento" para los

hispanoparlantes. Asignarle un valor a una variable utilizando uno de los

identificadores cambiará el valor al que se puede acceder a través de los otros

identificadores.

Los compiladores deben reemplazar los nombres simbólicos de las variables con

la real ubicación de los datos. Mientras que el nombre, tipo y ubicación de una

variable permanecen fijos, los datos almacenados en la ubicación pueden ser

cambiados durante la ejecución del programa.

Las variables pueden ser de longitud:

Fija.- Cuando el tamaño de la misma no variará a lo largo de la ejecución del

programa. Todas las variables, sean del tipo que sean tienen longitud fija,

salvo algunas excepciones — como las colecciones de otras variables (arrays)

o las cadenas.

Variable.- Cuando el tamaño de la misma puede variar a lo largo de la

ejecución. Típicamente colecciones de datos.

9

Page 5: Segundo trabajo

Tipos de datos fundamentals

Datos enteros: char, signed char, unsigned char, short, int, long, unsignet short,

unsigned unsigned long.

Datos reales: float, double long double.

Char indica que se trata de un carácter (una letra mayúscula o minúscula, un

dígito o un carácter especial,…). La palabra int indica que se trata de un

número entero, mientras que float se refiere a un número real (también llamado

de punto o coma flotante). Los números enteros pueden ser positivos o

negativos (signed) o bien esencialmente no negativos (unsigned); los

caracteres tienen un tratamiento muy similar a los enteros y admiten estos

mismos cualificadores. En los datos enteros, las palabras short y long hacen

referencia al número de cifras o rango de dichos números. En los datos reales

las palabras double y long apuntan en esta misma dirección, aunque con un

significado ligeramente diferente.

Caracteres (tipo char)

Las variables carácter (tipo char) contienen un único carácter y se almacenan

en un byte de memoria (8 bits). La declaración de variables tipo carácter

pueden tener forma:

Char nombre;

Char nombre1, nombre 2;

Se puede declarar más de una variable de un tipo determinado en una sola

sentencia. Se puede también inicializar la variable en la declaración. Por

ejemplo, para definir la variable carácter letra y asignarle el valor de a se puede

escribir:

10

Page 6: Segundo trabajo

Char letra= ‘a’.

Números enteros (tipo int)

De ordinario una variable tipo int se almacena en 2 bytes (16 bits), aunque

algunos compiladores usan 4 bytes. Los compiladores de Microsoft para PCs

utilizan 2 bytes.

Con 16 bits se pueden almacenar 216=65536 números enteros diferentes de 0

a 65535 para variables sin signo, y de -32768 al 32767 para variables con

signo. Este es el rango de las variables tipo int.

Números enteros (tipo long)

Existe la posibilidad de usar enteros con un rango mayor si se especifica como

tipo long en su declaración

Long int numero_grande;

El rango de un entero long puede variar según el computador o el compilador

que se utilice, pero de ordinario se utilizan 4 bytes (32 bits).

Números reales (tipo float)

En muchas aplicaciones hacen falta variables reales, capaces de representar

magnitudes que contengan una parte entera y una parte fraccionaria o decimal.

Estas variables se llaman también de punto flotante. De ordinario, en base 10 y

con notación científica, estas variables se representan por medio de la mantisa,

que es un número mayor o igual a 0.1 y menor que 1.0, y un exponente que

representa la potencia de 10.

Números reales (tipo double)

11

Page 7: Segundo trabajo

Las variables tipo float tienen un rango muy limitado, insuficiente para la mayor

parte de los cálculos técnicos y científicos. Este problema se soluciona con el

tipo doublé, que utiliza 8 bytes para almacenar una variable.

Operadores y Precendencia

Al utilizar dos o más operadores en una sentencia, algunos operadores tienen

precedencia sobre otros operadores. La precedencia y asociatividad de los

operadores determina el orden en que se procesan los operadores. ActionScript

tiene una jerarquía que determina qué operadores se ejecutan antes que otros. Al

final de esta sección encontrará una tabla en la que se expone esta jerarquía.

Aunque para aquellos usuarios familiarizados con la programación aritmética o

básica puede parecer algo natural que el compilador procese el operador de

multiplicación (*) antes que el operador de suma (+), el compilador necesita

instrucciones explícitas sobre qué operadores debe procesar primero. Dichas

instrucciones se conocen colectivamente como precedencia de operadores.

Puede ver un ejemplo de precedencia de operadores al utilizar los operadores de

multiplicación y suma:

var mySum:Number;

mySum = 2 + 4 * 3;

trace(mySum); // 14

Observará que el resultado de esta sentencia es 14, ya que la multiplicación tiene

una precedencia de operador superior. Por consiguiente, se calcula primero 4 * 3 y

el resultado se suma a 2.

Puede controlar lo que debe ocurrir colocando las expresiones entre paréntesis.

ActionScript establece una precedencia de operadores predeterminada que puede

modificar utilizando el operador de paréntesis (()). Al colocar la expresión de suma

entre paréntesis, ActionScript calcula primero la suma:

12

Page 8: Segundo trabajo

var mySum:Number;

mySum = (2 + 4) * 3;

trace(mySum); // 18

Ahora el resultado de esta sentencia es 18.

Los operadores también pueden tener la misma precedencia. En este caso, la

asociatividad determina el orden en que deben actuar los operadores. La

asociatividad puede ser de izquierda a derecha o de derecha a izquierda.

Observe de nuevo el operador de multiplicación. La asociatividad en este caso es

de izquierda a derecha, por lo que las dos sentencias siguientes son iguales.

var mySum:Number;

var myOtherSum:Number;

mySum = 2 * 4 * 3;

myOtherSum = (2 * 4) * 3;

trace(mySum); // 24

trace(myOtherSum); // 24

Pueden darse situaciones en las que dos o más operadores con la misma

precedencia aparezcan en la misma expresión. En estos casos, el compilador

utiliza las reglas de asociatividad para determinar qué operador se procesa

primero. Todos los operadores binarios, salvo los operadores de asignación,

tienen asociatividad desde la izquierda, lo que significa que los operadores de la

izquierda se procesan antes que los operadores de la derecha. Los operadores de

asignación y el operador condicional (?:) tienen asociatividad desde la derecha, lo

que significa que los operadores de la derecha se procesan antes que los

operadores de la izquierda. Para más información sobre operadores de

asignación, consulte Utilización de operadores de asignación. Para más

13

Page 9: Segundo trabajo

información sobre el operador condicional (?:), consulte El operador condicional.

Piense, por ejemplo, en los operadores menor que (<) y mayor que (>), que tienen

la misma precedencia. Si ambos operadores se utilizan en la misma expresión, el

operador de la izquierda se procesará en primer lugar porque ambos operadores

tienen asociatividad desde la izquierda. Esto significa que las dos sentencias

siguientes generan el mismo resultado:

trace(3 > 2 < 1); // false

trace((3 > 2) < 1); // false

El operador mayor que (>) se procesa primero, lo que da como resultado el valor

true porque el operando 3 es mayor que el operando 2. El valor true se pasa al

operador menor que (<) junto con el operando 1. El operador menor que (<)

convierte el valor true en el valor numérico 1 y compara el valor numérico con el

segundo operando 1 para devolver el valor false (el valor 1 no es menor que 1).

Estudie el orden de los operandos del código ActionScript, especialmente si

establece condiciones complejas y conoce la frecuencia con la que dichas

condiciones son verdaderas (true). Por ejemplo, si sabe i va a ser mayor que 50

en su condición, deberá escribir primero i<50. De esta forma, se comprobará

primero, con lo que no será necesario comprobar la segunda condición con tanta

frecuencia.

En la tabla siguiente se muestran los operadores de ActionScript 2.0 por orden

decreciente de precedencia. Cada fila de la tabla contiene operadores de la misma

precedencia. Cada fila de operadores tiene precedencia superior a la fila que

aparece debajo de ella en la tabla. Para más información y directrices sobre el uso

de operadores y paréntesis, consulte Aplicación de formato a la sintaxis de

ActionScript.

Grupo Operadores

Primario [] {x:y} () f(x) new x.y x[y]

Sufijo x++ x--

14

Page 10: Segundo trabajo

Unario ++x --x + - ~ ! delete typeof void

Multiplicativo * / %

Aditivo + -

Desplazamiento en modo bit

<< >> >>>

Relacional < > <= >= instanceof

Igualdad == != === !==

AND en modo bit &

XOR en modo bit ^

OR en modo bit |

AND lógico &&

OR lógico ||

Condicional ?:

Asignación = *= /= %= += -= <<= >>= >>>= &= ^= |=

Coma ,

15