我想用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发生器获得?

好,比复杂,困难产生良好的错误消息,和代码散装其他,我的意思。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top