flex
impieghi (circa) POSIX "Extended Regular Expression" Sintassi - \s
non funziona, perché è un'estensione Perl.
È un errore di battitura [ \t\t\r]+
? Penso che vorrai un \n
lì dentro.
Qualcosa di simile [ \n\t\r]+
certamente dovrebbe lavoro. Ad esempio, questo lexer (che ho salvato come lexer.l
):
%{
#include <stdio.h>
%}
%option noyywrap
%%
[ \n\t\r]+ { printf("Whitespace: '%s'\n", yytext); }
[^ \n\t\r]+ { printf("Non-whitespace: '%s'\n", yytext); }
%%
int main(void)
{
yylex();
return 0;
}
... corrisponde con successo gli spazi nel vostro ingresso esempio (che ho salvato come input.txt
):
$ flex lexer.l
$ gcc -o test lex.yy.c
$ ./test < input.txt
Non-whitespace: 'program'
Whitespace: '
'
Non-whitespace: '3.3'
Whitespace: ' '
Non-whitespace: '5'
Whitespace: ' '
Non-whitespace: '7'
Whitespace: '
'
Non-whitespace: '{'
Whitespace: ' '
Non-whitespace: 'comment'
Whitespace: ' '
Non-whitespace: '}'
Whitespace: '
'
Non-whitespace: 'string'
Whitespace: '
'
Non-whitespace: 'panic:'
Whitespace: ' '
Non-whitespace: 'cant'
Whitespace: ' '
Non-whitespace: 'happen'
Whitespace: '
'
fonte
2012-11-10 23:50:17
Sì Intendevo \ n invece di t: s in [\ t \ t \ r] + Grazie per la tua risposta, è corretto :) – mrjasmin
Usa '[\ n \ t \ r \ f] +' per abbinare la fine di tutte le righe. Omettendo '\ f' non corrisponderà alle terminazioni dei file Windows/DOS. Fonte: http://web.eecs.utk.edu/~bvz/cs461/notes/flex/ – ribamar