Как заставить пример лексера c-строки работать? - PullRequest
0 голосов
/ 12 февраля 2019

Следующий код f / lex взят из его руководства.Но это не будет работать самостоятельно.Некоторый дополнительный код необходим для его запуска.Но я не знаю, как добавить дополнительный код, необходимый.Кто-нибудь может показать мне?Спасибо.

%x str
%%
            char string_buf[MAX_STR_CONST];
            char *string_buf_ptr;

\"      string_buf_ptr = string_buf; BEGIN(str);

<str>\" { /* saw closing quote - all done */
        BEGIN(INITIAL);
        *string_buf_ptr = '\0';
        /* return string constant token type and
        * value to parser
        */
}

<str>\n {
/* error - unterminated string constant */
/* generate error message */
}

<str>\\[0-7]{1,3} {
        /* octal escape sequence */
        int result;
        (void) sscanf( yytext + 1, "%o", &result );
        if ( result > 0xff )
        /* error, constant is out-of-bounds */
        *string_buf_ptr++ = result;
}

<str>\\[0-9]+ {
        /* generate error - bad escape sequence; something
        * like '\48' or '\0777777'
        */
}
<str>\\n *string_buf_ptr++ = '\n';
<str>\\t *string_buf_ptr++ = '\t';
<str>\\r *string_buf_ptr++ = '\r';
<str>\\b *string_buf_ptr++ = '\b';
<str>\\f *string_buf_ptr++ = '\f';

<str>\\(.|\n) *string_buf_ptr++ = yytext[1];

<str>[^\\\n\"]+ {
    char *yptr = yytext;
    while ( *yptr ) *string_buf_ptr++ = *yptr++;
}

1 Ответ

0 голосов
/ 12 февраля 2019

Отсутствует в этом фрагменте кода:

  • Как обрабатываются условия ошибки.

  • Какой тип токена возвращается анализатору и какпредставлен семантический тип.

  • Проверяет, заполнен ли внутренний буфер фиксированной длины.

Третий требует проверкипосле каждого присвоения через string_buffer_ptr, что может привести к ошибочному состоянию, поэтому оно также возвращается к первому пункту выше.

По сути, это вещи, которые полностью зависят от вашего приложения.Как вы справляетесь с другими видами ошибок?Вы пытаетесь восстановить и продолжить анализ или вы просто пишете сообщение об ошибке и отказываетесь?Вам нужно будет заполнить обработку этих ошибок согласованно с другой обработкой ошибок.

Наиболее вероятный код для передачи результата будет выглядеть примерно так:

   BEGIN(INITIAL);
    *string_buf_ptr = '\0';
    /* return string constant token type and
     * value to parser
     */
    yylval.str = strdup(string_buf);
    return STRING_LITERAL;

Но, конечно, вы 'Вам нужно будет заменить str на правильный тег для char* в вашем семантическом объединении (если вы его используете) и заменить значение return на правильное имя токена.И вы могли бы предпочесть использовать malloc и strcpy вместо strdup, хотя есть много всего, что нужно просто убедиться, что у вас есть резервное определение strdup на тот случай, если оно вам понадобится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...