2009-10-28 13 views
10

저는 회사 내에서 20 년이 넘은 독점적 언어를 보완하는 데 도움을주었습니다. 그것은 크고 완전한 튜링 언어입니다. 다른 문법 체계 (예 : Antlr)로 번역하는 것은 옵션이 아닙니다 (나는 이것을 결정하지 않습니다).Yacc 문법 디버거가 있습니까?

대부분의 경우 문법 확장이 순조롭게 진행되었습니다. 그러나 가끔 한동안 나는

  • 이 때로는

(내 미약 한 뇌) 이해가되지 않습니다

  • 을 제거하기 어렵다는가 감소-감소 또는 Shift-줄거야 y.output 파일 및 실험적 문법 리팩토링에서 많은 고통스러운 시선을 겪은 후에 평소에 가고 싶었던 곳을 찾아 왔습니다. 때때로 나는 불만족스러운 타협을해야만했다.

    그래서 yacc 문법을 빨아 들일 수있는 탐색 도구가 있습니까? 브라우저를 개선하고 실험을하고 변경 사항을 디버깅 할 수 있습니까?

    프로덕션을 추가하는 경우 "어디서나 사용되는 원자력 생산"(식별자를 생각하면) "규칙 foo와 충돌"(예, 추가 정보, s/r, r/r, 그것보다, 그러나 나는 당신이 나의 표류를 얻는다라고 생각한다). 내 사고 캡을 쓰고 심볼 스택과 상태 머신을 상상해 보는 것 이상의 상호 작용에 대한 힌트를 얻는 것이 좋을 것입니다.

    업데이트 : 분명히해야 할 것 같습니다. 우리는 Berkeley Yacc를 사용합니다. 필자는 최근 버전의 Bison을 사용하여 테스트를 수행했습니다. 출력을 위해 문법을 --report = itemset으로 컴파일했습니다. 이 게시물에

    내 목표는 외부 도구 기능 보강 yacc를 함께 제공 문법 디버깅 기능을 추구하는 것입니다. 오늘은 기본 설정으로 고통 스럽습니다. Antlr과 함께 사용할 수있는 대화 형 도구를 찾을 수있게 도와주세요.

  • 답변

    7

    당신 수도 디버깅 출력을 생산하고 yacc -d의 도움을 얻을 - 그것은 기본적으로 기호 스택 상태 등의 전체 목록을 제공합니다. 출력은 밀도가 높고 볼륨이 크므로 모든 것을 읽으려는 시도는 직접 수행하는 경우가 거의 없습니다 (어쨌든 나를위한 적이 없었 음). 그러나 예를 들어 r/r 충돌을 변경하면 이전 문법과 새 문법에 yacc -d을 실행 한 다음 결과에 diff를 실행하여 더 자세한 실행 결과를 얻을 수 있습니다. 변경으로 인해 분쟁이 발생했습니다.

    그러나 s/r 충돌은 종종 문제가 아니라고 확신하는 경우가 많습니다. 종종 문제를 "고치려고"시도하는 것은 가치가 없습니다. 그래도 r/r 충돌은 사실이 아닙니다. 이들은 때로는 양성이지만 비교적 드뭅니다.

    편집 : 죄송합니다. -v 여야합니다. 당신은 y.output을 언급 했으므로 분명히 이미 그 부분을 수행하는 방법을 알고 있습니다. 요점은 y.output 파일을 직접 보려고하지는 않지만 깔끔하게 나온 파일과 실제 충돌에 대한 자세한 정보를 얻지 못한 파일 사이의 차이점을 확인하는 것입니다. 수십억 줄의 "물건"이 있습니다.

    +0

    나는 당신이 무슨 뜻인지 잘 모르겠다. 두 yaccs에서 -d는 "토큰 매크로에 대한 헤더 파일을 출력"을 의미합니다. 스위치 --report = itemset 사용에 대한 추가 정보를 추가했습니다. 이것이 당신이 말하는 것입니까? 모든 상태 전환 정보로 가득 찬 y.output 파일을 생성합니다. 나는 그것을 사용하고 있지만 더 강력하고 쌍방향의 도구를 원했습니다. –

    +1

    Jerry가 맞습니다. S/R 충돌이 반드시 버그는 아닙니다. 거의 모든 실제 문법에는 많은 것들이 있습니다. – DigitalRoss