Lex解析没有空格

时间:2012-02-23 14:39:14

标签: c++ shell yacc lex

我使用Lex,Yacc和C ++编写自定义shell。它在Unix环境中运行。只要令牌之间有空格,它目前工作正常。例如:

ls | grep test > out

将通过:

WORD PIPE WORD WORD GREAT WORD

到Yacc,然后从那里采取行动。但是,当没有空格时我需要它才能工作。例如:

ls|grep test>out

应与上一个命令的工作方式相同。但是,它目前只通过:

WORD WORD

有没有办法在Lex标记它之前解析输入?

修改

这是我的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 个答案:

答案 0 :(得分:1)

您需要更改WORD的定义。现在,当它遇到一个字母字符时,它将所有内容都考虑到下一个空格,作为WORD的一部分。

您想要更改它,以便它不包含您用于其他目的的任何标点符号:

[^ \t\n\>\<\|\&]+  {
    /* Assume that file names have only alpha chars */
    yylval.string_val = strdup(yytext);
    return WORD;
}

答案 1 :(得分:0)

我明白了。 WORD包括管道和其他特殊字符。 我把它改成了

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

现在可行。