Как я могу разобрать строку C (char *) с flex / bison? - PullRequest
8 голосов
/ 25 ноября 2010

В моем проекте по программированию я хочу анализировать атрибуты командной строки, используя flex / bison.Моя программа называется так:

./prog -a "(1, 2, 3)(4, 5)(6, 7, 8)" filename

Можно ли проанализировать эту строку, используя flex / bison, не записывая ее в файл и не анализируя этот файл?

Ответы [ 5 ]

5 голосов
/ 25 ноября 2010
3 голосов
/ 25 ноября 2010

Я думаю, что вы можете достичь чего-то подобного (я сделал подобное), используя fmemopen, чтобы создать поток из char*, а затем заменить его на стандартный ввод

Что-то подобное (не уверенесли он полностью функционален, так как я на самом деле пытаюсь запомнить доступные системные вызовы, но это будет что-то похожее на это)

char* args = "(1,2,3)(4,5)(6,7,8)"
FILE *newstdin = fmemopen (args, strlen (args), "r");
FILE *oldstdin = fdup(stdin);

stdin = newstdin;

// do parsing

stdin = oldstdin;
2 голосов
/ 28 марта 2016

Вот полный пример сгибания.

%%

<<EOF>> return 0;

.   return 1;

%%

int yywrap()
{
    return (1);
}

int main(int argc, const char* const argv[])
{
    YY_BUFFER_STATE bufferState = yy_scan_string("abcdef");

    // This is a flex source. For yacc/bison use yyparse() here ...    
    int token;
    do {
        token = yylex();
    } while (token != 0);

    // Do not forget to tell flex to clean up after itself. Lest
    // ye leak memory.
    yy_delete_buffer(bufferState);

    return (EXIT_SUCCESS);
}
0 голосов
/ 30 мая 2016

другой пример. этот переопределяет макрос YY_INPUT:

%{
int myinput (char *buf, int buflen);
char *string;
int offset;
#define YY_INPUT(buf, result, buflen) (result = myinput(buf, buflen));
%}
%%

[0-9]+             {printf("a number! %s\n", yytext);}

.                  ;
%%

int main () {
    string = "(1, 2, 3)(4, 5)(6, 7, 8)";
    yylex();
}

int myinput (char *buf, int buflen) {
    int i;
    for (i = 0; i < buflen; i++) {
        buf[i] = string[offset + i];
        if (!buf[i]) {
            break;
        }
    }
    offset += i;
    return i;
}
0 голосов
/ 07 августа 2015

Ответ - «Да». См. Публикацию О'Рейли под названием «lex & yacc», 2-е издание Дуга Брауна, Джона Левина, Тони Мэйсона. См. Главу 6, раздел «Ввод из строк».

Я также только что заметил, что в разделе "Ввод из строк", глава 5 "flex and bison", есть несколько хороших инструкций Джона Левина. Обратите внимание на процедуры yy_scan_bytes (char * bytes, int len), yy_scan_string ("string") и yy_scan_buffer (char * base, размер yy_size_t). Я сам не сканировал строки, но скоро попробую.

...