/ / Ustanowienie reguły pasowania w żubrze - c ++, c, bison, flex-lexer

Ustanowienie reguły pasowania w żubrze - c ++, c, bison, flex-lexer

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 № 1

Moż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.