Как высказать мнение YY_INPUT к строке, а не stdin в Lex & Yacc (Солярис)

Я хочу мой yylex() проанализировать строку, а не файл или стандартный вход. Как я могу сделать это с Lex и Yacc, которому предоставляют Солярис?

13
задан Jonathan Leffler 23 September 2012 в 17:20
поделиться

2 ответа

Вот что-то, что должно работать с любой реализацией, хотя и рискованно при использовании 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]
0
ответ дан 1 December 2019 в 22:07
поделиться

Если вы используете настоящий lex , а не flex , я считаю, что вы можете просто определить свой собственный

int input(void);

Это может возвращать символы из строки или что угодно.

В качестве альтернативы, я считаю, что вы можете записать строку в файл и открыть файл в потоке yyin . Я подозреваю, что это сработает с любой реализацией.

Если вы используете flex, я думаю, вы переопределите макрос YY_INPUT () ,

6
ответ дан 1 December 2019 в 22:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: