题
我想用YACC和lex写一个shell和我遇到的一些问题,我的I / O重定向器。目前,我可以使用<和>操作精细,以任何顺序,但我的问题是,我可以用任何错误两次重定向,如“LS>日志>的log 2”
我的规则的代码如下,任何人都可以给我如何解决这一问题有什么秘诀?谢谢!
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重定向的多个副本
解决方案
有两种方法:
(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),似乎可能导致更好的错误信息和较简单的语法。
其他提示
还有第三种方法 - 不要担心。击(在Cygwin的)不会生成一个错误:
ls > x > y
它创建x和然后y和结束写为y。
我知道这可能只是一个学习lexx和yacc锻炼,但在其他方面的第一个问题就是问的为什么的要使用lexx和yacc?任何常见的shell命令语言有一个非常简单的语法;你在使用一个LALR发生器获得?
好,比复杂,困难产生良好的错误消息,和代码散装其他,我的意思。
不隶属于 StackOverflow