yacc,只申请一次规则

时间:2009-02-23 18:22:12

标签: shell yacc

我正在尝试使用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重定向的多个副本。

3 个答案:

答案 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发电机获得了什么?

嗯,除了复杂性,难以生成好的错误消息和代码批量,我的意思是。