위키미디어 마크업 구문 분석 - EBNF 기반 구문 분석기가 적합하지 않습니까?

StackOverflow https://stackoverflow.com/questions/1093036

문제

Wikipedia에 있는 Wikimedia 마크업을 Java로 구문 분석하려고 합니다.이 작업을 위한 기존 패키지가 많이 있지만 내 요구 사항에 특히 잘 맞는 패키지를 찾지 못했습니다.내가 함께 일한 최고의 패키지는 Mathclipse Bliki 파서, 대부분의 페이지에서 괜찮은 작업을 수행합니다.

그러나 이 파서는 불완전하여 특정 페이지를 구문 분석하지 못하거나 다른 페이지를 잘못 구문 분석합니다.안타깝게도 코드는 다소 지저분하므로 이 구문 분석 엔진의 문제를 해결하는 데 시간이 많이 걸리고 오류가 발생하기 쉽습니다.

더 나은 구문 분석 엔진을 찾으려고 이 작업에 EBNF 기반 구문 분석기(특히 ANTLR)를 사용하여 조사했습니다.그러나 몇 번 시도한 후에는 이 접근 방식이 이 작업에 특히 적합하지 않은 것 같습니다. 왜냐하면 Wikimedia 마크업은 상대적으로 느슨하여 구조화된 문법에 쉽게 들어맞을 수 없기 때문입니다.

그러나 ANTLR 및 유사한 파서에 대한 나의 경험은 매우 제한적이므로 이러한 파서가 본질적으로 이 작업에 적합하지 않은 것이 아니라 문제를 일으키는 것은 내 경험 부족일 수 있습니다.이 주제에 대해 더 많은 경험을 가진 사람이 여기에 참여할 수 있습니까?

@스토보르:나는 Google 쿼리에서 반환된 엔진을 포함하여 다양한 구문 분석 엔진을 살펴봤다고 언급했습니다.지금까지 내가 찾은 것 중 최고는 Bliki 엔진입니다.문제는 이러한 파서로 문제를 해결하는 것이 엄청나게 지루하다는 것입니다. 왜냐하면 파서는 본질적으로 조건문과 정규식의 긴 체인으로 이루어져 스파게티 코드가 생성되기 때문입니다.나는 EBNF 구문 분석 방법과 더 유사한 방법을 찾고 있습니다. 그 방법이 훨씬 더 명확하고 간결하여 이해하고 발전하기가 더 쉽기 때문입니다.귀하가 게시한 미디어위키 링크를 보았는데, 기본적으로 제공되는 EBNF가 이 작업에 적합하지 않다는 나의 의심이 확인된 것 같습니다.따라서 나는 EBNF처럼 명확하고 이해하기 쉬우면서도 위키 마크업의 지저분한 구문을 처리할 수 있는 구문 분석 엔진을 찾고 있습니다.

도움이 되었습니까?

해결책

일반적인 의미에서 미디어위키 콘텐츠를 구문 분석하는 것은 미디어위키 자체를 사용하지 않는 한 거의 불가능합니다.이를 구문 분석하려면 HTML 및 CSS(내장 가능)를 완벽하게 구문 분석할 수 있어야 하고, 전체 템플릿 인스턴스화 및 확장은 물론 관련 콘텐츠가 사용했을 수 있는 구문 분석기 추가도 처리할 수 있어야 합니다.해당 템플릿 인스턴스화는 전처리기와 동일합니다.

파서가 잘못된 입력과 파서 확장에 의해 만들어진 임의의 구문 추가도 처리한다는 점을 제외하면 어떤 의미에서는 C++를 구문 분석하는 것과 유사합니다.실제 미디어위키 구현은 Perl 5와 매우 유사합니다. 원래 구현은 모든 극단적인 경우가 발생하지만 모든 것이 서로 연결되어 있기 때문에 그렇게 나쁘지 않았습니다. 그러나 실제로 동일한 작업을 수행하기 위한 후속 구현을 얻는 것은 정말 복잡합니다. 행동은 종종 창발적이고 문서화되지 않았으며 설계되지 않았습니다.

작업하는 데 페이지의 100%가 필요하지 않거나 모든 콘텐츠를 추출할 수 있는 경우에는 자신에게 맞는 것을 함께 엮을 수 있으며, 앞서 언급한 것처럼 이를 수행하는 일부 패키지가 있습니다.실제 정확한 요구 사항을 아는 것이 부족하여 누군가가 구문 분석 방법에 대해 훨씬 더 나은 답변을 줄 수 있을지 의심됩니다.모든 페이지에서 작업하고 모든 것을 올바르게 구문 분석할 수 있어야 한다면 상당히 큰 팀을 보유하고 몇 년 동안 작업하는 것이 더 좋습니다. 그럼에도 불구하고 여전히 작은 예외 사례가 많이 있습니다.

간단히 말해서, EBNF 그래머는 미디어위키 마크업을 구문 분석하는 데 적합하지 않지만 실제로는 아무것도 아닙니다...

다른 팁

당신 말이 맞습니다. Wikimedia는 잘 정의된 EBNF 문법 작성자에게 적합하지 않습니다.

Wiki를 구문 분석할 수 있으려면 역추적하는 도구를 살펴봐야 합니다.

역추적 yacc인 btyacc입니다.http://www.siber.com/btyacc/

엑센트를 보시면 됩니다.Yacc보다 낫네요http://accent.compilertools.net/

아니면 당신이 소유한 프롤로그와 롤의 맛을 분석하고 배워야 할 수도 있습니다.당신이 무엇을 하든 당신 앞에는 흥미로운 학습 기간이 있습니다.

행운을 빌어요

나는 한때 파서를 작성하려고 시도했습니다. 부스트.퀵북, 이는 Wikipedia에서 사용하는 위키 텍스트와 본질적으로 동일합니다.

몇 가지 기본 사항을 작동시키는 것만으로도 매우 지루한 과정이었지만 결국에는 이를 위한 EBNF 문법을 작성하는 것이 가능할 것이라고 생각합니다.관심이 있으시면, 내 부분 파서 온라인에서 사용할 수 있습니다(문법은 문서 문자열에 포함되어 있습니다).

이 대답은 약간은 있지만, 다양한 위키 구성 요소를 파악하기 위해 텍스트를 렌더링한 다음 HTML Dom을 구문 분석하는 것은 어떻습니까?

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