我正在尝试使用yacc和lex编写shell,我遇到了I / O重定向器的一些问题。目前,我可以使用<和>运算符很好,任何顺序,但我的问题是我可以重定向两次没有错误,如“ls> log> log2”
我的规则代码如下,有人可以给我一些如何解决此问题的提示吗?谢谢!
io_mod:
iomodifier_opt io_mod
|
;
iomodifier_opt:
GREAT WORD {
printf(" Yacc: insert output \"%s\"\n", $2);
Command::_currentCommand._outFile = $2;
}
|
LESS WORD {
printf(" Yacc: insert input \"%s\"\n", $2);
Command::_currentCommand._inputFile = $2;
}
| /* can be empty */
;
编辑:在与我的TA交谈之后,我了解到我实际上不需要为我的命令只有1个修饰符,而且我实际上可以拥有相同I / O重定向的多个副本。
答案 0 :(得分:4)
有两种方法:
(1)修改语法,使你只能拥有各种修饰符之一:
io_mod_opt: out_mod in_mod | in_mod out_mod | in_mod | out_mod | ;
(2)修改子句处理程序以计算修饰符并报告错误(如果有多个):
GREAT_WORD { if (already_have_output_file()) { error("too many output files: \"%s\"\n", $2) } else { /* record output file */ } }
选项(2)似乎可能导致更好的错误消息和更简单的语法。
答案 1 :(得分:1)
还有第三种方法 - 不要担心。 Bash(在Cygwin下)不会产生错误:
ls > x > y
它创建x然后y并最终写入y。
答案 2 :(得分:-1)
我意识到这可能仅仅是学习lexx和yacc的练习,但第一个问题是问为什么你想要使用lexx和yacc?任何通常的shell命令语言都有一个非常简单的语法;你使用LALR发电机获得了什么?
嗯,除了复杂性,难以生成好的错误消息和代码批量,我的意思是。