Mam parser wygenerowany przy użyciu Flex / Bison - toanalizuje każdą linię pliku i zwraca niektóre dane wyjściowe dla tej linii. Moje dane wejściowe są trochę uszkodzone, a co chcę zrobić, to dodać znak specjalny (np. #) Na początku linii, które chciałbym, aby żubr zignorować, i tylko echo linii do wyjścia.
Więc jeśli moje wejście wyglądało
apples 3 ate
oranges 4 consumed
# rhino ten
moje wyniki po analizie linii mogą być
I ate three apples
I consumed four oranges
# rhino ten
Czy jest jakiś prosty sposób na zrobienie tego?
Odpowiedzi:
3 dla odpowiedzi № 1Możesz to zrobić leksykalnie w skanerze flex.
Coś jak:
^#.*n { fputs(yytext, stdout); /* increment line number */ }
Lub w analizatorze składni:
^#.*n { yystype.lexeme = strdup(yytext);
return HASH_ECHO; /* token type defined in parser */ }
W parserze wystarczy wygenerować z gramatyki najwyższego poziomu produkcję dla tego:
/* in top section */
%union {
/* ... */
char *lexeme;
/* ... */
}
%token<lexeme> HASH_ECHO
/*...*/
/* make sure this rule is hooked into your grammar, of course */
hash_echo : HASH_ECHO { fputs($1, stdout); free($1); }
;
Nie jestem pewien co do włączenia tej linii; Nie mam pojęcia, jak sobie z nimi radzisz, więc może nie być to właściwe.