-
Regras válidas por um período limitado.
-
É possível declarar um conjunto de regras que só são
válidas temporariamente. Para ativá-las, usa-se a macro
BEGIN(nome), onde nome é o nome do conjunto
de regras. Estas regras são identificadas por conterem a cadeia
<nome> no início da condição.
-
Para cancelar as regras extras, usa-se BEGIN(0). Mais de
um conjunto pode ser ativado a qualquer momento.
-
Os nomes das regras extras devem ser declarados de uma das seguintes formas,
na primeira seção da especificação:
-
Com %s nome declara-se regras adicionais. Quando ativadas,
elas se somam às regras sem qualificação especial.
-
Com %x nome declara-se regras exclusivas. Isto é,
quando ativadas, apenas estas regras valem.
- In addition to characters and ranges of characters, character
classes can also contain character class "expressions". These are
expressions enclosed inside `[': and `:'] delimiters (which themselves
must appear between the '[' and ']' of the character class; other
elements may occur inside the character class, too). The valid
expressions are:
[:alnum:] [:alpha:] [:blank:]
[:cntrl:] [:digit:] [:graph:]
[:lower:] [:print:] [:punct:]
[:space:] [:upper:] [:xdigit:]
These expressions all designate a set of characters equivalent to
the corresponding standard C `isXXX' function. For example,
`[:alnum:]' designates those characters for which `isalnum()' returns
true - i.e., any alphabetic or numeric. Some systems don't provide
`isblank()', so flex defines `[:blank:]' as a blank or a tab.
For example, the following character classes are all equivalent:
[[:alnum:]]
[[:alpha:][:digit:]
[[:alpha:]0-9]
[a-zA-Z0-9]
-
No exemplo a seguir, isso ficará mais claro.
-
Um exemplo mais complicadinho usando Flex: um conversor de real para dólar.
-
O Exemplo usa a seguinte função:
-
SYNOPSIS
#include <monetary.h>
ssize_t strfmon(char *s, size_t maxsize,
const char *format,
...);
DESCRIPTION
The strfmon() function places
characters into the array
pointed to by s as controlled
by the string pointed to by
format. No more than maxsize
bytes are placed into the
array.
-
/* Conversor de real para dolar */
/* O primeiro argumento do programa é a taxa de conversão
*/
/* O programa converte valores monetários com prefixo R$
para US$. Os
* milhares devem estar separados por '.' e os centavos por
',', uma vez
* que o "locale" foi definido para o Brasil. Isto não
vale para o
* argumento do programa.
*/
%{
#include <math.h>
#include <locale.h>
double taxa = 1.;
void converte(double d) {
char b[2048];
strfmon(b,2048,"%!n", d/taxa);
printf("US$%s", b);
}
%}
MILHAR [[:digit:]]{3}
VAL -?[[:digit:]][[:digit:]]?[[:digit:]]?
CENT [[:digit:]]{2}
SEP [[:space:]]*
double valor=0.;
%s VALOR MEIO
%%
R[$]{SEP} BEGIN(VALOR);
<VALOR>{VAL} {
valor = atof(yytext);
BEGIN(MEIO);
}
<MEIO>[.]{MILHAR} {
valor *=1000;
valor += atof(++yytext);
}
<MEIO,VALOR>[,]{CENT} {
valor += atof(++yytext)/100;
converte(valor);
valor = 0.;
BEGIN(0);
}
<VALOR,MEIO>. {
converte(valor);
valor = 0.;
BEGIN(0);
}
. ECHO;
%%
int main(int ac, char **av)
{
ac--, av++;
if (ac)
{
taxa = atof(*av);
ac--, av++;
}
if (!taxa)
{
fprintf(stderr,"Taxa
inaceitável\n");
exit(1);
}
setlocale(LC_ALL,"pt_BR");
if (ac) yyin = fopen(*av,"r");
yylex();
}