문제

YACC와 Lex를 사용하여 쉘을 쓰려고 노력하고 있으며 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 리디렉션의 여러 사본을 가질 수 있다는 것을 알게되었습니다.

도움이 되었습니까?

해결책

두 가지 접근 방식이 있습니다.

(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)은 더 나은 오류 메시지와 더 간단한 문법으로 이어질 것으로 보입니다.

다른 팁

세 번째 접근 방식도 있습니다. bash (cygwin 아래)는 다음에 대한 오류를 생성하지 않습니다.

ls > x > y

그것은 x를 생성 한 다음 y를 생성하고 y에 쓸 수 있습니다.

나는 이것이 Lexx와 YACC를 배우는 운동 일 뿐이지 만, 그렇지 않으면 첫 번째 질문은 물어 보는 것입니다. lexx와 yacc를 사용하고 싶습니까? 모든 일반적인 쉘 명령 언어에는 매우 간단한 문법이 있습니다. LALR 발전기를 사용하여 무엇을 얻고 있습니까?

글쎄, 복잡성, 좋은 오류 메시지를 생성하는 데 어려움, 코드 대량입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top