在我的编程项目中,我想使用flex / bison来解析命令行属性。我的程序就像这样调用:
./prog -a "(1, 2, 3)(4, 5)(6, 7, 8)" filename
是否可以使用flex / bison解析此字符串而无需将其写入文件并解析该文件?
答案 0 :(得分:5)
答案 1 :(得分:3)
我认为你可以通过使用fmemopen
从char*
创建一个流然后将其替换为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)
%{
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)。我自己没有从字符串中扫描过,但很快就会尝试。