Передача токенов из lex / flex в bison / yacc [duplicate]

Вы можете просто использовать видимость css: скрытый / видимый вместо отображения: none / block

div {
    visibility:hidden;
    -webkit-transition: opacity 1s ease-out;
    -moz-transition: opacity 1s ease-out;
    -o-transition: opacity 1s ease-out;
    transition: opacity 1s ease-out;
    opacity: 0; 
}

parent:hover > div {
    opacity: 1;
    visibility: visible;
}
0
задан ndn 14 October 2015 в 17:26
поделиться

1 ответ

Я понимаю, что выводимый вывод отладки генерируется в синтаксическом анализаторе, а не из сканера. Лучший способ увидеть вывод отладки в сканере - сгенерировать сканер с помощью параметров командной строки -d или --debug или поместить %option debug в определение гибкого сканера. Это будет печатать строку в stderr для каждого согласованного правила.

Распознавание регулярных выражений на основе DFA не предоставляет значимого отладочного вывода по каждому символу; теоретически, прогресс государственной машины можно проследить, но было бы очень сложно интерпретировать и, вероятно, не все, что было бы полезно.

По-видимому, поврежденная информация в вашем отладочном выходе в синтаксическом анализаторе, скорее всего, является результатом действия сканера следующим образом:

{some_pattern}       { /* DO NOT DO THIS */ yylval.str = yytext; 
                       return SOME_TOKEN;
                     }

Значение yytext и памяти, на которую он указывает, являются приватными для сканера yylex, и значения могут меняться без уведомления. В частности, после того, как yylex снова вызван, чтобы отсканировать токен, он может быть перемещен непредсказуемым образом.

Вместо этого вы должны сделать копию строки токена (и не забудьте освободить копия, когда она вам больше не нужна):

{some_pattern}       { yylval.str = strdup(yytext); 
                       return SOME_TOKEN;
                     }

Примечание. Если вы не хотите использовать strdup (возможно, потому, что ваш токен может содержать символы NUL), хорошей альтернативой является:

char* buf = malloc(yyleng + 1); /* No need to call strlen */
memcpy(buf, yytext, yyleng);    /* Works even if there is a NUL in the token */
buf[yyleng] = 0;                /* Remember to NUL-terminate the copy */

Ссылки: flex manual note on yytext / bison FAQ по уничтоженным строкам

1
ответ дан rici 26 August 2018 в 01:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: