как использовать yy_scan_string в lex - PullRequest
7 голосов
/ 15 декабря 2009

Я хочу разобрать строку, которую я даю парсеру в главной функции yacc. Я знаю, что это можно сделать с помощью yy_scan_string, но я не знаю, как его использовать. Я искал в Интернете и на страницах руководства, но мне все еще не ясно. Пожалуйста, помогите мне.

Ответы [ 5 ]

16 голосов
/ 15 июня 2011

На случай, если кому-то понадобится образец для лексера с повторным входом:

int main(void)
{
    yyscan_t scanner;
    YY_BUFFER_STATE buf;
    yylex_init(&scanner);
    buf = yy_scan_string("replace me with the string youd like to scan", scanner);
    yylex(scanner);
    yy_delete_buffer(buf, scanner);
    yylex_destroy(scanner);
    return 0;
}
7 голосов
/ 01 сентября 2010

Это работает для меня. У меня есть этот код в разделе подпрограмм (то есть третий раздел) моего файла Bison:

struct eq_tree_node *parse_equation(char *str_input)
{
    struct eq_tree_node *result;

    yy_scan_string(str_input);
    yyparse();
    /* to avoid leakage */
    yylex_destroy();

    /* disregard this. it is the function that I defined to get
    the result of the parsing. */
    result = symtab_get_parse_result();

    return result;
}
4 голосов
/ 29 марта 2012

Это сработало для меня ... используйте yy_scan_string ()

int main(int argc, char **argv)
{
char Command[509];
int ReturnVal;

    char input[40] = "This is my input string";

    /*Copy string into new buffer and Switch buffers*/
    yy_scan_string (input);

    /*Analyze the string*/
    yylex();

    /*Delete the new buffer*/
    yy_delete_buffer(YY_CURRENT_BUFFER);
}
4 голосов
/ 15 декабря 2009

Я всегда рекомендую эту страницу людям, которые хотят изучать lex / yacc (или flex / bison)

0 голосов
/ 18 декабря 2009

Я нашел и пример здесь для себя. Пусть это может быть полезно для вас:

http://osdir.com/ml/lex.flex.windows/2003-04/msg00008.html

...