Documente Academic
Documente Profesional
Documente Cultură
MATERIA
LENGUAJES Y AUTÓMATAS I
ALUMNO
PROFESOR
Codigo de Usuario
%%
Opciones y Declaraciones
%%
Reglas Lexicas
En todas las partes de la especificación se permiten los comentarios de la forma /* comment text */ y los /*
comment text */ fin de línea de estilo Java que comienzan con // .Los comentarios de JFlex se anidan, por lo
que el número de /* y */ debe estar equilibrado.
significa que comienza una línea con %class seguida de un espacio seguido del nombre de la clase para el
escáner generado ( no se deben ingresar las comillas dobles, vea también la especificación del ejemplo ).
El valor de <CUPSYM> defecto es sym y se puede cambiar con la directiva %cupsym . En el modo de
compatibilidad JLex ( --jlex switch en la línea de comando), %eofcloseno se activará.
%cup2
La %cup2directiva es similar al modo CUP, solo para el generador CUP2 de TU Munich
en http://www2.in.tum.de/cup2 . Hace lo siguiente:
%eofval { return 0;
%eofval
} %eofclose
declara el conjunto de identificadores STATE1, STATE3, XYZ, STATE_10, ABC, STATE5como estados
léxicos, STATE1, ABC, STATE5lo más inclusivo, y STATE3, XYZ, STATE_10como exclusiva. Vea
también Cómo se empareja la entrada en la forma en que los estados léxicos influyen en cómo se empareja la
entrada.
4.2.11 Definiciones de macros
Una macro definición tiene la forma.
macroidentifier = regular expression
Eso significa que una definición de macro es un identificador de macro (letra seguida de una secuencia de
letras, dígitos o guiones bajos), que luego se puede usar para hacer referencia a la macro, seguida de un
espacio en blanco opcional, seguida de una =, seguida de un blanco opcional. espacio, seguido de una
expresión regular (consulte Reglas léxicas para obtener más información sobre la sintaxis de las expresiones
regulares).
La expresión regular en el lado derecho debe estar bien formada y no debe contener los operadores ^, /o $. A
diferencia de JLex, las macros no son solo fragmentos de texto que se expanden al copiar , sino que se analizan
y deben estar bien formados.
Esta es una característica Elimina algunos errores muy difíciles de encontrar en especificaciones léxicas (como
no tener paréntesis alrededor de macros más complicadas, lo que no es necesario con JFlex). Consulte Portar
desde JLex para obtener más detalles sobre los problemas de las macros de estilo JLex.
Como se permite tener usos de macros en las definiciones de macros, es posible usar una notación similar a la
gramática para especificar la estructura léxica deseada. Sin embargo, las macros permanecen solo como
abreviaturas de las expresiones regulares que representan. No son no terminales de una gramática y no pueden
usarse recursivamente. JFlex detecta ciclos en definiciones de macros y los informa en el momento de la
generación. JFlex también le advierte acerca de las macros que se han definido pero nunca se usaron en
la sección de reglas léxicas de la especificación.
4.3.1 Sintaxis
La sintaxis de la sección de reglas léxicas se describe mediante la siguiente gramática EBNF (los símbolos de
la terminal están incluidos entre "citas"):
LexicalRules ::= (Include|Rule)+
| StateGroup
| ('!'|'~') RegExp
| RegExp ('*'|'+'|'?')
| CharClass
| PredefinedClass
| MacroUsage
| Character
| Character'-'Character
| MacroUsage | PredefinedClass
| '[:jletterdigit:]'
| '[:letter:]'
| '[:digit:]'
| '[:uppercase:]'
| '[:lowercase:]'
| '\d' | '\D'
| '\s' | '\S'
| '\w' | '\W'
| '\R' | '.'
4.3.2 Semántica
Esta sección proporciona una descripción informal de qué texto coincide con una expresión regular, es decir,
una expresión descrita por la RegExpproducción de la gramática anterior .
Una expresión regular que consiste únicamente en
a Charactercoincide con este personaje.
una clase de personaje [...]coincide con cualquier personaje en esa clase. A Characterse considera un
elemento de una clase si aparece en la lista o si su código se encuentra dentro de un rango de
caracteres Character'-'Charactero macro o una clase de caracteres predefinidos. Así, [a0-3\n]por
ejemplo, coincide con los personajes
a 0 1 2 3 \n
Si la lista de caracteres está vacía (es decir, solo []), la expresión no coincide con nada (el conjunto
vacío), ni siquiera con la cadena vacía. Esto puede ser útil en combinación con el operador de
negación.! .
Los conjuntos de caracteres pueden estar anidados, por ejemplo, [[[abc]d[e]]fg]es equivalente
a [abcdefg].
Operaciones de juego de caracteres soportadas:
o Unión ( ||), por ejemplo [[ac]||[df]], equivalente a [a-cd-f]: esta es la operación predeterminada del
conjunto de caracteres cuando no se especifica ningún operador.
o Intersección ( &&), por ejemplo [[af]&&[fm]], equivalente a [f].
o Establecer diferencia ( --), por ejemplo [[az]--m], equivalente a [a-ln-z].
o Diferencia simétrica ( ~~): la unión de dos clases menos su intersección. Por ejemplo
[\p{Letter}~~\p{ASCII}]
es equivalente a
[[\p{Letter}||\p{ASCII}]--[\p{Letter}&&\p{ASCII}]]
\p{Lowercase}
o Las propiedades de Unicode son clases de caracteres especificadas por cada versión de Unicode
Standard. JFlex admite un subconjunto de todas las propiedades definidas para cada versión
Unicode compatible. Para ver la lista completa de propiedades admitidas, dé la –uniprops
<ver>opción en la línea de comandos de JFlex, donde <ver>está la versión Unicode. Algunas
propiedades tienen alias; JFlex reconoce todos los alias para todas las propiedades soportadas.
JFlex admite la concordancia suelta de Propiedades: se ignoran las distinciones entre
mayúsculas y minúsculas, espacios en blanco, guiones y guiones bajos.
Para referirse a una propiedad de Unicode, use la \p{...}sintaxis, por ejemplo, el bloque griego
puede denominarse \p{Block:Greek}. Para hacer coincidir todos los caracteres no incluidos en
una propiedad, use la \P{...}sintaxis (tenga en cuenta que ' P' está en mayúsculas), por ejemplo,
para hacer coincidir todos los caracteres que no son letras, use \P{Letter}.
Consulte UTS # 18 (Davis y Heninger 2013) para obtener una descripción y enlaces a las
definiciones de algunas propiedades admitidas. UnicodeSet (“Unicode Utilities: UnicodeSet”
2015) es una utilidad en línea para mostrar los conjuntos de caracteres correspondientes a las
propiedades de Unicode y establecer operaciones en ellos, pero solo para la versión más reciente
de Unicode.
o Dot(.) coincide [^\r\n\u2028\u2029\u000B\u000C\u0085].
Utilice la –legacydotopción para emparejar en su lugar [^\n].
o \Rcoincide con cualquier carácter de nueva línea: \r\n|[\r\n\u2028\u2029\u000B\u000C\u0085].
Son útiles cuando se trabaja con expresiones de contexto finales. La expresión a | (c / d) | bno es una expresión
regular sintácticamente legal, pero se puede expresar mediante la |acción:
a | c / d | b { some action }
La primera línea declara dos estados léxicos (inclusive) Ay B, la segunda línea, un estado léxico
exclusivo C. El estado predeterminado (incluido) YYINITIALsiempre está implícitamente allí y no es
necesario declararlo. La regla de expr1no tiene estados mencionados, y por lo tanto se corresponde en
todos los estados los mas exclusivos, es decir A, B, y YYINITIAL. En su acción, el escáner se cambia a
estado A. La segunda regla expr2solo puede coincidir cuando el escáner está en estado YYINITIALo A.
La regla expr3sólo puede ser igualado en el estado Ay expr4en los estados A, By C.
Los estados léxicos se declaran y se usan como intconstantes de Java en la clase generada con el
mismo nombre que se usan en la especificación. No hay garantía de que los valores de estas constantes
enteras sean distintos. Son indicadores en la tabla DFA generada, y si JFlex reconoce dos estados como
equivalentes léxicos (si se usan con el mismo conjunto de expresiones regulares), las dos constantes
obtendrán el mismo valor.
Este método solo está disponible en el archivo esqueleto skeleton.nested. Lo puedes encontrar en
el srcdirectorio de la distribución JFlex.
void yypopStream()
Cierra la secuencia de entrada actual y continúa leyendo desde la que está en la parte superior de la
pila de secuencias.
Este método solo está disponible en el archivo esqueleto skeleton.nested. Lo puedes encontrar en
el srcdirectorio de la distribución JFlex.
boolean yymoreStreams()
Devuelve verdadero si todavía hay secuencias para yypopStreamleer en la pila de secuencias.
Este método solo está disponible en el archivo esqueleto skeleton.nested. Lo puedes encontrar en
el srcdirectorio de la distribución JFlex.
int yystate()
Devuelve el estado léxico actual del escáner.
void yybegin(int lexicalState)
entra en el estado léxico lexicalState
void yypushback(int number)
empuja numberJava chars (a diferencia de los puntos de código Unicode) del texto coincidente de nuevo
en el flujo de entrada. Se volverán a leer en la próxima llamada del método de escaneo. El número de
caracteres que se volverán a leer no debe ser mayor que la longitud del texto coincidente. Los caracteres
rechazados no se incluirán en yylength()y yytext(). Tenga en cuenta que en Java las cadenas son
invariables, es decir, un código de acción como
String matched = yytext(); yypushback(1); return matched;
En todas las partes de la especificación se permiten los comentarios de la forma /* comment text */ y los /*
comment text */ fin de línea de estilo Java que comienzan con // .Los comentarios de JFlex se anidan, por lo
que el número de /* y */ debe estar equilibrado.
Cada directiva JFlex debe sentarse al principio de una línea y comienza con el carácter % . Las directivas que
tienen uno o más parámetros se describen a continuación.
%class "classname"
Eso significa que una definición de macro es un identificador de macro, seguida de una =, seguida de un blanco
opcional,espacio, seguido de una expresión regular
La expresión regular en el lado derecho debe estar bien formada y no debe contener los operadores ^, /o $.
4.3.1 Sintaxis
La sintaxis de la sección de reglas léxicas se describe mediante la siguiente gramática EBNF. La gramática
utiliza los siguientes símbolos terminales: (Algunos Ejemplos)
File
un nombre de archivo, ya sea absoluto o relativo al directorio que contiene la especificación léxica.
Number
un entero decimal no negativo.
Identifier
una letra [a-zA-Z]seguida de una secuencia de cero o más letras
Character
una secuencia de escape o cualquier carácter Unicode que no sea uno de estos metacaracteres: | ( ) { }
[]<>\.*+?^$/."~!
StringCharacter
una secuencia de escape o cualquier carácter Unicode que no sea uno de estos metacaracteres: \ "
Los caracteres de espacio en blanco " y \t se pueden usar para mejorar la legibilidad de las expresiones
regulares. Ellos serán ignorados por JFlex.
JFlex aplica las siguientes precedencias de operadores estándar en expresiones regulares operadores de sufijo
unarios
operadores de prefijo unarios ( !, ~)
concatenación ( RegExp::= RegExp Regexp)
unión ( RegExp::= RegExp '|' RegExp)
4.3.2 Semántica
Esta sección proporciona una descripción informal de qué texto coincide con una expresión regular.
Una expresión regular que consiste únicamente en
Un Character coincide con este personaje.
Una clase de personaje [...] coincide con cualquier personaje en esa clase.
Si la lista de caracteres está vacía,la expresión no coincide con nada, ni siquiera con la cadena vacía. .
Los conjuntos de caracteres pueden estar anidados
o Unión ( ||), por ejemplo [[ac]||[df]], equivalente a [a-cd-f].
o Intersección ( &&), por ejemplo [[af]&&[fm]], equivalente a [f].
o Establecer diferencia ( --), por ejemplo [[az]--m], equivalente a [a-ln-z].
Si a y b son expresiones regulares, entonces
a | b (Unión) es la expresión regular que coincide con todas las entradas coincidentes por a o por b.
ab (concatenación) es la expresión regular que coincide con la entrada coincidente con a seguida por la
entrada coincidente con b.
a* coincide con cero o más repeticiones de la entrada que coincide con a
a+ (iteración) es equivalente a aa*
a? (opción) coincide con la entrada vacía o la entrada coincidente con a
!a (negación) coincide con todo, pero las cadenas emparejadas por a.
~a (hasta) hace coincidir todo hasta la primera aparición de un texto que coincida con a.
a {n} (repetir)
a {n,m} es equivalente a al menos n veces y la mayoría de las m veces la concatenación de a
(a) coincide con la misma entrada que a.