yacc, применяя правило только один раз - PullRequest
1 голос
/ 23 февраля 2009

Я пытаюсь написать оболочку, используя yacc и lex, и у меня возникают некоторые проблемы с моими перенаправителями ввода / вывода. В настоящее время я могу использовать операторы <и> нормально и в любом порядке, но моя проблема в том, что я могу перенаправить дважды без ошибок, например, "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 модификатор для моей команды и что у меня действительно может быть несколько копий одного и того же перенаправления ввода / вывода.

Ответы [ 3 ]

4 голосов
/ 23 февраля 2009

Есть два подхода:

(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 голос
/ 27 февраля 2009

Есть и третий подход - не волнуйтесь. Bash (под Cygwin) не генерирует ошибку для:

ls > x > y

Создает x, а затем y и в итоге записывает в y.

0 голосов
/ 23 февраля 2009

Я понимаю, что это может быть просто упражнение для изучения lexx и yacc, но в противном случае первый вопрос - почему вы хотите использовать lexx и yacc? Любой обычный язык команд оболочки имеет довольно простую грамматику; что вы получаете от использования генератора LALR?

Ну, я имею в виду не только сложность, сложность генерирования хороших сообщений об ошибках и объем кода.

...