Лекс разбора без пробелов - PullRequest
       4

Лекс разбора без пробелов

1 голос
/ 23 февраля 2012

Я кодирую пользовательскую оболочку, используя 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;
}

%%

Ответы [ 2 ]

1 голос
/ 23 февраля 2012

Вам необходимо изменить определение WORD. Прямо сейчас, когда он встречает буквенный символ, он рассматривает все до следующего пробела как часть этого WORD.

Вы хотите изменить это, чтобы оно не включало пунктуацию, которую вы используете для других целей:

[^ \t\n\>\<\|\&]+  {
    /* Assume that file names have only alpha chars */
    yylval.string_val = strdup(yytext);
    return WORD;
}
0 голосов
/ 23 февраля 2012

Я понял это. СЛОВО включало трубы и другие специальные символы. Я изменил это на

[^\|\>\<\& \t\n][^\|\>\<\& \t\n]*  {
    yylval.string_val = strdup(yytext);
    return WORD;
}

и теперь это работает.

...