문제
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 발전기를 사용하여 무엇을 얻고 있습니까?
글쎄, 복잡성, 좋은 오류 메시지를 생성하는 데 어려움, 코드 대량입니다.