Я хочу мой yylex()
проанализировать строку, а не файл или стандартный вход. Как я могу сделать это с Lex и Yacc, которому предоставляют Солярис?
Вот что-то, что должно работать с любой реализацией, хотя и рискованно при использовании popen.
$ cat a.l
%%
"abc" {printf("got ABC\n");}
"def" {printf("got DEF\n");}
. {printf("got [%s]\n", yytext);}
%%
int main(int argc, char **argv)
{
return(lex("abcdefxyz"));
}
lex(char *s)
{
FILE *fp;
char *cmd;
cmd=malloc(strlen(s)+16);
sprintf(cmd, "/bin/echo %s", s); // major vulnerability here ...
fp=popen(cmd, "r");
dup2(fileno(fp), 0);
return(yylex());
}
yywrap()
{
exit(0);
}
$ ./a
got ABC
got DEF
got [x]
got [y]
got [z]
Если вы используете настоящий lex
, а не flex
, я считаю, что вы можете просто определить свой собственный
int input(void);
Это может возвращать символы из строки или что угодно.
В качестве альтернативы, я считаю, что вы можете записать строку в файл и открыть файл в потоке yyin
. Я подозреваю, что это сработает с любой реализацией.
Если вы используете flex, я думаю, вы переопределите макрос YY_INPUT ()
,