我使用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;
}
%%
答案 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;
}
现在可行。