2009-07-06 7 views
9

CSS를 파싱하는 파서를 작성 중입니다.CSS 파서를 테스트하는 방법은 무엇입니까?

CSS reference grammar을 수정하여 사용중인 3rd-party parser generator tool에서 지원되는 문법 및 렉서 구문을 사용합니다.

필자는 문법 코딩을 마쳤다고 생각합니다. 파서 생성기는 이제 내 문법에 대한 상태 전이 테이블을 생성 할 수 있습니다.

결과 (파서 생성기의 출력)는 약 116 개의 "규칙"이며 switch 문에서 116 개의 경우에 해당합니다. 이러한 규칙/스위치 문장의 예는 다음과 같습니다

  1. 스타일 시트는 문자 집합을 지정하지 않고
  2. 스타일 시트가 시작되는 문자 집합을 지정하는 시작 :
  3. 스타일 시트는
  4. 스타일 시트 공백
  5. 시작 비어 있습니다 ... 등등 ...

파서 생성기는 모두 나를 위해 할 수있는 일을했으며, 이제는 (여러 손으로) 글쓰기를 시작합니다. 사람들이 '추상 구문 트리'라고 부르는 것을 구축 할 switch 구문의 사례

제 질문은이 문제를 테스트하는 방법입니다. 내가 원하는 것은 다양한 조합과 가능성을 행사하는 CSS 파일 집합입니다. charset를 지정하는 하나의 CSS 파일. charset을 지정하지 않는 다른 파일. 등

  • 거기 일반하는 방법을 자동으로 생성 규칙 집합이 임의의 문법에 대한 입력 데이터의 세트, 또는?

  • 또는 특히 개의 CSS 파일이 있습니다. 그 목적은 표준 CSS 문법이 허용하는 조합과 가능성을 포괄하는 것입니까?

나는이 모든 잘못에 대해 언급하고 싶습니다.

순간 나는 필요가 없습니다

  • 파일이 불법 입력의 처리를 테스트하기 위해 (즉, 문법을 따르지 않는 파일) 방법의

  • 테스트 다양한 브라우저는 CSS의 자신의 분석을 기반으로 렌더링

답변

2

문맥 자유 문법이 암시 적으로 (구문 분석) 나무의 무한 집합을 제안합니다. 제안 된 각 트리에는 해당 문법에서 허용하는 언어로 구체적인 문장을 만드는 일련의 잎이 있습니다. 제안 된 트리 세트를 탐색함으로써 (예를 들어, 가능한 대안에 따라 각 비 터미널을 확장함으로써) 임의의 언어 인스턴스를 생성 할 수 있습니다. 나무 제안을 걷고 무작위로 선택하여 일련의 테스트를 생성 할 수 있습니다. 보다 집중된 접근법은 반복적 인 심화 검색을 사용하여 크기별로 정렬 된 문장을 생성하는 것입니다. 흥미로운 문법을 사용하면 많은 수의 인스턴스를 얻을 수 있지만 자동 테스트가 필요한 것입니다.

당신이 생성하는 문장은 받아 들일 문장이 될 것이기 때문에 내가하지 말아야 할 것은 프로덕션 문법에서 그런 문장을 생성하는 것입니다. - {참조를 사용하여 문장 생성기를 구성해야합니다 문법을 사용하여 사용자가 받아 들인 내용과 구현 한 내용이 다를 수 있다는 사실을 악용합니다.

+0

문법에 따라 약 55 개의 비 터미널이 있습니다. top-down 파서로 평가한다면, 최상위 레벨 비 터미널과 관련된 메소드는 하위 레벨 비 터미널과 관련된 메소드를 호출합니다. 각 non-terminal 메소드는 (메소드 내에서 switch 문을 통해) 약 1-3 개의 하위 레벨 메소드를 호출하고 1 또는 때로는 2 개의 다른 상위 레벨 메소드에 의해 호출됩니다. 모든 코드가 적어도 한 번 테스트되면 (모든 가능성의 모든 조합을 기대하지는 않음) 보장하기 위해 완전한 코드 커버리지를 얻을 수도 있습니다 ... – ChrisW

+0

... (55x 3 =) 150 개의 테스트 케이스. 문법에서 자동으로 이러한 테스트 케이스를 생성 할 때 얻게되는 것이 거의 없다는 점에 동의합니다. 그러나 저는 다른 사람들이 다음과 같은 이유로 공식적으로 학교에서 파싱에 관해 말하지 않았기 때문에 질문을 던졌습니다 : 그리고 저는 파서 테스트를위한 잘 알려진 알고리즘이 있는지 당신이 배웠는지 궁금합니다. – ChrisW

+0

아무도 저에게 파서를 시험하는 방법을 학교 나 밖에서 가르쳐주지 않았습니다. 커리큘럼에없는 것뿐입니다. 대부분의 컴파일러에 대한 참조 정보는 컴파일러가 실제로 구현 한 내용과 일치하지 않기 때문에 (Microsoft와 C#을 목격하고 문제를 해결하기 위해 테스트를 거쳤습니다.) 표준, 그것을 구현하지 않았다!). 실제 참고 문법을 사용하면 운이 좋은 것처럼 보입니다. –

관련 문제