Я кодирую пользовательскую оболочку, используя Lex, Yacc и C ++. Он запускается в среде Unix. В настоящее время он работает нормально, если между токенами есть пробелы. например:
ls | grep test > out
пройдет:
WORD PIPE WORD WORD GREAT WORD
в Yacc, и тогда оттуда предпринимаются действия. Тем не менее, мне нужно, чтобы это работало, когда нет также мест. например:
ls|grep test>out
должно работать так же, как и предыдущая команда. Тем не менее, в настоящее время он только проходит:
WORD WORD
есть ли способ проанализировать входные данные до того, как Лекс его разметит?
Edit:
Вот мой файл Lex:
%{
#include <string.h>
#include "y.tab.h"
%}
%%
\n {
return NEWLINE;
}
[ \t] {
/* Discard spaces and tabs */
}
">" { return GREAT; }
">&" { return GREATAMPERSAND; }
">>" { return GREATGREAT; }
">>&" { return GREATGREATAMPERSAND; }
"<" { return LESS; }
"|" { return PIPE; }
"&" { return AMPERSAND; }
[^ \t\n][^ \t\n]* {
/* Assume that file names have only alpha chars */
yylval.string_val = strdup(yytext);
return WORD;
}
. {
/* Invalid character in input */
return NOTOKEN;
}
%%