Documentos de Académico
Documentos de Profesional
Documentos de Cultura
a. Lenguaje C
i) Conjuntos de Caracteres
En la elaboración de programas en C se pueden utilizar para formar los elementos básicos
(constantes, variables, operadores, expresiones) las letras mayúsculas de la A a la Z, las
minúsculas de la a a la z , los dígitos del 0 al 9 y ciertos caracteres especiales:
! * + \ " <
# ( = | { >
% ) ~ ; } /
^ - _ [ : '
? & . ] (blanco)
iii)
b. Lenguaje C++
i)
ii)
Constantes enteras
Ejemplo 1:
1912 3 8 6578 0
Una constante entera octal está formada por cualquier combinación de dígitos tomados del 0
al 7. El primer dígito obligatoriamente tiene que ser 0 (esto es para distinguir la constante
como un número octal).
Ejemplo 2:
0 03 0654 032
Una constante entera hexadecimal debe comenzar por 0x o 0X, a continuación puede aparecer
cualquier combinación del 0 al 9 o de la a a la f (tanto mayúsculas como minúsculas).
Ejemplo 3:
iii)
Integrantes: Julian Rosero, Christian Diaz, Michael Borja Lenguajes y Compiladores
c. Lenguaje C#
i) Los caracteres en C# no tienen un tamaño de 8 bits como en otros muchos lenguajes de
programación, sino que usan un tamaño de 16 bits llamado Unicode al cual se le llama char. No
existen conversiones automáticas de tipo entero a char.
C#, al igual que C++, define un tipo de cadena de caracteres. Dentro de la cadena de caracteres
se pueden usar secuencias de escape. Una cadena de caracteres puede iniciarse con el símbolo
@ seguido por una cadena entre comillas ("), en tal caso, las secuencias de escape no tienen
efecto, y además la cadena puede ocupar dos o más líneas.
ii)
Integrantes: Julian Rosero, Christian Diaz, Michael Borja Lenguajes y Compiladores
iii) En C# reserva 76 identificadores para uso propio, se les conoce como palabras clave y cada
una de ellas posee un significado particular.
d. Lenguaje Fortran
i) El conjunto de caracteres admisible para FORTRAN es el siguiente :
• Las letras A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
• Los dıgitos 0 1 2 3 4 5 6 7 8 9..
• Los caracteres especiales.
ii)
iii) Los identificadores deben empezar con una letra y pueden tener hasta 31 letras, dígitos o
caracteres de subrayado _.
• Por ejemplo, identificadores válidos son:
• Masa, MASA, Velocidad_de_la_luz, Sueldo_del_ultimo_mes,X007.
• Y no válidos: R2-D2, 34JUlio, pepe$.
Integrantes: Julian Rosero, Christian Diaz, Michael Borja Lenguajes y Compiladores
e) Lenguaje JAVA
i) En Java los caracteres no están restringidos a los ASCII sino son Unicode. Un carácter está siempre
rodeado de comillas simples como 'A', '9', 'ñ', etc. El tipo de dato char sirve para guardar estos caracteres.
Un tipo especial de carácter es la secuencia de escape, similares a las del lenguaje C/C++, que se
utilizan para representar caracteres de control o caracteres que no se imprimen. Una secuencia
de escape está formada por la barra invertida (\) y un carácter. En la siguiente tabla se dan las
secuencias de escape más utilizadas.
retorno de
\r
carro
tabulador
\t
horizontal
nueva línea \n
barra invertida \\
iii) Los identificadores se utilizan para los nombres de las clases, de los métodos y de las variables.
Un identificador puede ser cualquier secuencia descriptiva de letras mayúsculas o minúsculas,
números, el carácter de subrayado, o el símbolo del dólar. Un identificador no debe empezar nunca
con un número, para evitar la confusión con un literal numérico. Conviene recordar otra vez que
Java distingue entre mayúsculas y minúsculas; así, el identificador VALOR no es lo mismo que el
identificador valor.Ejemplo:
Integrantes: Julian Rosero, Christian Diaz, Michael Borja Lenguajes y Compiladores
f) Lenguaje Lisp
i) En Lisp las cadenas de caracteres son átomos, y pueden contener cualquier carácter. En forma
escrita, los átomos cadena de caracteres utilizan la representación habitual de caracteres
encerrados entre comillas dobles.
ii)
iii) Símbolos (Identificadores): Estos átomos comienzan con un caracter seguido de cualquier
otro caracter excepto espacios, comas, puntos o paréntesis. Ejemplo: casa, ca&, casa1, C, etc.
Integrantes: Julian Rosero, Christian Diaz, Michael Borja Lenguajes y Compiladores
g) Lenguaje SQL
i) Para un usuario o un grupo:
Los caracteres válidos son: 'A'-'Z'; 'a'-'z'; '0'-'9'; '#'; '@'; '$'; '_'; '!'; ' '('; ')'; '{'; '}'; '-'; '.'y '^'.
Los caracteres siguientes deben delimitarse entre comillas si se especifican en el procesador de
línea de mandatos: '!'; ' '('; ')'; '{'; '}'; '-'; '.'y '^'.
El nombre no puede empezar por los caracteres 'SYS', 'IBM' ni 'SQL'.
El nombre no puede ser: 'ADMINS', 'GUESTS', 'LOCAL', 'PUBLIC' ni 'USERS'.
Un ID de autorización delimitado no debe contener letras en minúsculas.
ii)
iii)
• identificadores de SQL
Existen dos tipos de identificadores de SQL: ordinarios y delimitados.
o Un identificador ordinario es una letra mayúscula seguida por cero o más
caracteres, cada uno de los cuales es una letra en mayúsculas, un dígito o el
carácter de subrayado. Tenga en cuenta que pueden utilizarse letras en
minúsculas al especificar un identificador ordinario, pero éstas se convertirán en
mayúsculas al procesarse. Un identificador ordinario no debe ser una palabra
reservada.
Ejemplos
WKLYSAL WKLY_SAL
o Un identificador delimitado es una secuencia de uno o varios caracteres entre
comillas dobles. Los espacios en blanco interlineados en la secuencia son
significativos. Los espacios en blanco rezagados en la secuencia no son
significativos, a pesar de que se almacenan con el identificador. Dos comillas
consecutivas se utilizan para representar unas comillas dentro del identificador
delimitado. Se puede utilizar un identificador delimitado cuando la secuencia de
Integrantes: Julian Rosero, Christian Diaz, Michael Borja Lenguajes y Compiladores
3.3.2 Describa los lenguajes detonados por las siguientes expresiones regulares:
1. a(a|b)*a
2. ((ε|a)b*)*
3. (a|b)*a(a|b)(a|b)
4. a*ba*ba*ba*
5. !! (aa|bb)*((ab|ba)(aa|bb)*(ab|ba)(aa|bb)*)*
1. Inducción
L( a ) ( L( a|b ) ) * L( a )
Entonces:
L( a ) = { a }
( L( a|b ) ) * L( a ) = { ε, a, aa, …, b, bb, bbb, ….} { a } = { a, aa, aaa, …., ba , bba, bbba, …}
L( a ) ( L( a|b ) ) * L( a ) = L{ a } { a, aa, aaa, …., ba , bba, bbba, …} = { aa, aaa , aaaa, … , aba,
abba, abbba, …}
2. Inducción
( L( ε |a ) L( b) * ) *
Entonces:
L( b ) = { b } → ( L( b )*) = { ε, b ,bb ,bbb, …}
L( ε |a ) = { ε,a }
Operaciones:
L( ε |a ) L( b)* = { ε,a } { ε, b ,bb ,bbb, …} ={ b, bb, bbb, …., a ,ab, abb, abbb }
Cadena de a y b
3. Inducción
Operaciones:
L( a|b )* L( a) = { ε, a ,aa ,aaa, …, b, bb, bbb, …} { a } = { a, aa, aaa, …, ba, bba, bbba, …}
L( a|b )* L( a) L( a|b ) = { a, aa, aaa, …, ba, bba, bbba, …} { a,b } = {aa, aaa,aaaa, …,
baa,bbaa,bbbaa,…,ab,aab,aaab,…,bab,bbab,bbbab,…}
L( a|b )* L( a) L( a|b ) L( a|b ) = {aa, aaa,aaaa, …, baa,bbaa,bbbaa, …, ab,aab,aaab, …,
bab,bbab,bbbab,…}{ a,b } = { aaa, aaaa, …, baaa, bbaaa, bbbaaa, …, aba, aaba, aaaba, …,
baba, bbab, bbbaba, …, aab,aaab,aaaab, …,baab,bbaab,bbbaab, …abb,aabb,aaabb,
…,babb,bbabb,bbbabb,…}
Cadena de a y b terminada en a o b
Integrantes: Julian Rosero, Christian Diaz, Michael Borja Lenguajes y Compiladores
4. Inducción a*ba*ba*ba*
L( a )* L( b) L( a )* L( b) L( a )* L( b) L( a )*
Entonces:
L( a ) = { a} → L( a )* = { ε, a ,aa ,aaa, …}
L( b ) = { b }
Operaciones:
L( a) *L( b ) = { ε, a ,aa ,aaa, …} { b } = { b, ab, aab,aaab,…}
L( a )* L( b) L( a )* L( b) L( a )* L( b) L( a )*
={ bbb, bababa, baaabaabaa, …, abbb, aaabbaba, aaabaabaabaa, aaaabaaabaaabaaa,…}
5. Inducción (aa|bb)*((ab|ba)(aa|bb)*(ab|ba)(aa|bb)*)*
a) Prefijo de n: una cadena que se obtiene eliminando cero o más símbolos desde
derecha de la cadena n.
b) Sufijo: de n: una cadena que se forma suprimiendo cero o más símbolos desde la
izquierda de una cadena n por ejemplo era es un sufijo de bandera.
3.3.4 La mayoría de los lenguajes son sensible a mayúsculas y minúsculas por lo que la palabra
clave solo pueden escribirse de una forma y las expresiones regulares que describen su lexema
son muy simples. No obstante, algunos lenguajes como SQL son insensibles a mayúsculas y
minúsculas, por lo que una palabra clave puede escribirse en minúsculas o en mayúsculas, o en
cualquier mescla de ambas. Por lo que una palabra clave puede escribirse en minúsculas o en
mayúsculas, o en cualquier mescla de ambas. Por ende, la palabra clave SELECT de SQL
también puede escribirse como select, Select, o sELEct o sELEcT. Muestre como escribir una
expresión regular para una palabra Clave en un lenguaje insensible a mayúsculas y minúsculas.
Ilustre la idea escribiendo la expresión “select”.
((S)(s)(E)(e)(L)(l)(E)(e)(C)(c)(T)(t))
S[eleCt]* = SeleCt
Integrantes: Julian Rosero, Christian Diaz, Michael Borja Lenguajes y Compiladores
s[ElecT]* = sElecT
Posición 7= piones
a b c d e f g h
8 8
7 7
6 6
5 5
4 4
3 3
2 2
1 1
a b c d e f g h
1.e4 e5 2.f4 exf4 3.Bc4 Qh4+ 4.Kf1 b5 5.Bxb5 Nf6 6.Nf3 Qh6 7.d3 Nh5 8.Nh4 Qg5 9.Nf5 c6 10.g4
Nf6 11.Rg1 cxb5 12.h4 Qg6 13.h5 Qg5 14.Qf3 Ng8 15.Bxf4 Qf6 16.Nc3 Bc5 17.Nd5 Qxb2 18.Bd6
Bxg1 19.e5 Qxa1+ 20.Ke2 Na6 21.Nxg7+ Kd8 22.Qf6+ Nxf6 23.Be7# 1-0
!! h) Todas las cadenas de as y que que no contengan la subcadena abb.
(a*b) (b|a*)
3.3.7 Observe que estas expresiones regulares proporcionan a todos los siguientes símbolos
(caracteres de operadores) un significado especial:
\".~$[]+?{}|/
Su significado especial debe desactivarse si se necesitan para representarse a sí mismos en una
cadena de caracteres. Para ello, debemos colocar el carácter entre comillas, dentro de una
cadena de longitud uno o más; por ejemplo, la expresión regular "**" coincide con la cadena
**. También podemos obtener el significado literal de un carácter de operador si le
anteponemos una barra diagonal inversa. Por ende, la expresión regular \ * \ * también
coincide con la cadena **. Escriba una expresión regular que coincida con la cadena "\
\"\\
3.3.8 En Lex, una clase de carácter complementado representa a cualquier carácter, excepto los
que se listan en la clase de carácter. Denotamos a un carácter complementado mediante el uso
de ^ como el primer carácter; este símbolo no forma en sí parte de la clase que se está
complementando, a menos que se liste dentro de la misma clase. Así, [^A-Za-z] coincide con
cualquier carácter que no sea una letra mayúscula o minúscula, y [^\^] representa a cualquier
carácter excepto ^ (o nueva línea, ya que el carácter nueva línea no puede estar en ninguna
clase de caracteres). Muestre que, para cualquier expresión regular con clases de caracteres
complementados, hay una expresión regular equivalente sin clases de caracteres
complementados.
[^A-Za-z] = [0-9]
[^A-Z] = [a-z0-9]
Integrantes: Julian Rosero, Christian Diaz, Michael Borja Lenguajes y Compiladores
[^\^]= ϵ
Ejercicio 3.3.9: La expresión regular 𝑟{𝑚, 𝑛}coincide con las ocurrencias entre m y n del patrón r. Por
ejemplo, 𝑎{𝑚, 𝑛}coincide con una cadena de una a cinco a’s. Muestre que para cada expresión regular que
contiene operadores de repetición de esta forma, hay una expresión regular equivalente sin operadores de
repetición.
Solución
𝑚, 𝑛 números enteros
Por ejemplo:
Letra [a-z]
{𝑙𝑒𝑡𝑟𝑎}{2,4} {𝑙𝑒𝑡𝑟𝑎}{𝑙𝑒𝑡𝑟𝑎}|{𝑙𝑒𝑡𝑟𝑎}{𝑙𝑒𝑡𝑟𝑎}{𝑙𝑒𝑡𝑟𝑎}|{𝑙𝑒𝑡𝑟𝑎}{𝑙𝑒𝑡𝑟𝑎}{𝑙𝑒𝑡𝑟𝑎}{𝑙𝑒𝑡𝑟𝑎}
Ejercicio 3.3.10: El operador ˄ coincide con el extremo izquierdo de una línea, y $ coincide con el extremo
derecho de una línea. El operador ˄ también se utiliza para introducir las clases de caracteres
complementados, pero el con texto siempre deja en claro cuál es el significado deseado. Por ejemplo, ˄ [˄
a e i o u] *$ coincide con cualquier línea completa que no contiene una vocal en minúscula.
Por ejemplo:
[˄a-z] es complemento.
b) ¿Podemos sustituir siempre una expresión regular, usando los operadores ˄ y $, por una
expresión equivalente que no utilice ninguno de estos operadores?
• Aunque se demostró dos ejercicios atrás, que podemos remplazar una expresión regular
que utiliza ˄ como complemento por otra expresión regular equivalente, no existe una
expresión regular para remplazar ˄ como comienzo de una línea, por lo que no podríamos
sustituir siempre una expresión regular.
Ejercicio 3.3.11: El comando del intérprete (shell) de UNIX sh utiliza los operadores de la figura 3.9 en
expresiones de nombres de archivo para describir conjuntos de nombres de archivos. Por ejemplo, la
Integrantes: Julian Rosero, Christian Diaz, Michael Borja Lenguajes y Compiladores
expresión de nombre de archivo ∗. 𝑜 coincide con todos los nombres de archivo que terminen en . 𝑜;
𝑜𝑟𝑑𝑒𝑛1 . ? coincide con todos los nombres de archivo de la forma 𝑜𝑟𝑑𝑒𝑛. 𝑐,
1
2
3
4
5
en donde c es cualquier carácter. Muestre cómo pueden sustituirse las expresiones de nombres de archivo
de sh por expresiones regulares equivalentes, usando sólo los operadores básicos de unión, concatenación
y cerradura.
Solución
Ejercicio 3.3.12: SQL permite una forma rudimentaria de patrones, en los cuales dos caracteres tienen un
significado especial: el guion bajo (_) representa a cualquier carácter y el signo de por ciento (%)
representa a cualquier cadena de 0 o más caracteres. A demás, el programador puede definir cualquier
carácter, por decir e, para que sea el carácter de escape, de manera que si colocamos a e antes de e antes
de _, % o cualquier e, obtenemos el carácter que va después de su significado literal. Muestre cómo
expresar cualquier patrón de SQL como una expresión regular, dado que sabemos cuál es el carácter de
escape.
Tenemos