2014-10-09 10 views
0

나는이 간단한 예처럼 태그와 ABNF 문법이 포함 된 파일이 있습니다읽기/파일에서 C++ 태그와 ABNF 문법을 분석

$name = Bertha {userID=013} | Bob {userID=429} | (Ben | Benjamin) {userID=265}; 
$greet = Hi | Hello | Greetings; 

$S = $greet $name; 

이제 작업을 분석하여 사용자 ID를 취득하는 것입니다 이 문법에 주어진 문장. 예를 들어, 429 문법들이 실행 사이를 전환 할 수 있기 때문에 실행시에 읽을 수있는 사용자 ID를 우리에게 제공해야 문장

Greetings Bob 

를 분석.

지금에 대한 나의 접근 방식은 다음

  1. 이와 분석들이

  2. 에 속하는 잎 또는 노드에 태그를 넣어, 하나 또는 여러 개의 나무로 문장을 문법 구문 분석/주어진 문장을 생성하는 트리를 구성하는 트리 (예를 들어 Earley를 사용하려고 생각합니다)

  3. 이 트리를 사용하여 태그를 얻습니다 (이 예와 달리 여러 개의 다른 태그가 있습니다). ~에서와 같이 Ree)

    내 질문에,이 소프트웨어를 사용하거나 적어도이 작업을 해결하기 위해 수정할 수있는 소프트웨어 구성 요소가 있습니까? 특히 1 단계와 2 단계는 매우 일반적인 것 같습니다 (1. ABNF 문법을 C++ 내부 표현 (예 : 나무)으로 읽음) 2. 초기 알고리즘 (예 : 1.)에서 내부 표현으로 작업하고 1 단계에 대한 완전한 오류 방지 ABNF 파서는 나를 위해 정말로 시간이 많이 걸리는 작업이 될 것입니다.

저는 VoiceXML 문법이 이와 같이 작동한다는 것을 알고 있지만, 파서를 찾을 수 없습니다. 기본적으로 문법이 컴파일 타임에 알려지지 않았기 때문에 나에게 실용적이지 않은 단일 문법에 대한 C++ 코드를 생성하는 파서 생성기를 찾을 수있었습니다.

아이디어가 있으십니까?

답변

1

위로 2001 년에 저는 런타임에 지정된 규칙에서 파서를 생성하는 C++ 라이브러리를 작성했습니다. LGPL 라이센스가있는 SourceForge as project BuildParse에서 사용할 수 있습니다. 필자는 다른 두 프로젝트에서이 파일을 사용했고, 2009 년 현재 C++에서 작동하도록 업데이트했습니다. 파서가 빠르면 상관 없습니다.

기본적으로 구문 분석기를 사용하여 buildparse가 사용하는 데이터 구조로 문법을 구문 분석 한 다음 (buildparse를 사용할 수도 있음) buildparse 파서 생성기를 실행하여 토큰을 인식 할 수있는 무언가를 생성해야합니다.