如何用flex / bison解析C字符串(char *)?

时间:2010-11-25 17:43:17

标签: c bison flex-lexer

在我的编程项目中,我想使用flex / bison来解析命令行属性。我的程序就像这样调用:

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

是否可以使用flex / bison解析此字符串而无需将其写入文件并解析该文件?

5 个答案:

答案 0 :(得分:5)

请参阅此问题String input to flex lexer

答案 1 :(得分:3)

我认为你可以通过使用fmemopenchar*创建一个流然后将其替换为stdin来实现类似的东西(我做了类似的事情)

类似的东西(不确定它是否完全正常,因为我实际上是想记住可用的系统调用,但它会与此类似)

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 :(得分:2)

这是一个完整的flex示例。

%%

<<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);
}

答案 3 :(得分:0)

另一个例子。这个重新定义了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;
}

答案 4 :(得分:-1)

答案是“是”。参见O'Reilly出版物名为“lex&amp; yacc”,第二版由Doug Brown,John Levine,Tony Mason撰写。请参阅第6章“从字符串输入”一节。

我还注意到John Levine在“flex and bison”第5章“输入来自弦乐”一节中有一些很好的说明。注意例程yy_scan_bytes(char * bytes,int len),yy_scan_string(“string”)和yy_scan_buffer(char * base,yy_size_t size)。我自己没有从字符串中扫描过,但很快就会尝试。