2012-04-25 3 views
2

저는 C++로 프로젝트를 코딩하고 있으며, 텍스트 파일 (usergrammar.txt)을 인간이 읽고 쓸 수있는 형태로 작성하는 사용자 정의 문법을 찾고 있습니다. 객체를 정의합니다.런타임에 문법로드

이 작업을 마치면 코드에서 이러한 개체 중 일부를 인스턴스화하고 다른 파일 (instances.txt)에 만든 인스턴스를 항상 인간이 액세스 할 수있는 형식으로 저장할 수 있기를 바랍니다. 이 두 번째 파일은 첫 번째 파일이 올바르게 읽혀 지는지 분명히 다릅니다.

문제가있는 것은 문법을 정의하고 파싱하는 방법입니다. 나는 Boost :: Spirit을보고 있었지만 첫 번째 파일을 읽는 데 좋은 일을하는 반면 (규칙은 미리 정의되어 있기 때문에), Spirit 문법 만 정의되기 때문에 두 번째 파일에는 적용 할 수 없다고 생각합니다. 컴파일 시간과 런타임에로드 할 수 없습니다 (적어도 내가 이해할 수있는).

이제는 ENBF 형식에 대해 읽었지만 언어 규칙뿐 아니라 각 개체마다 다른 이름/설명/옵션이 포함될 때마다 문제가 발생합니다. (예를 들어, 개체 색상이있는 경우 내부의 정수는 빨간색, 파란색, yello로 표시되고 개체는 눈금자이면 정수로 길이가 지정됩니다.) 그래서이 정보를 파일뿐만 아니라 해당 값과 올바르게 연관되도록합니다.

이런 프로젝트에 대해보고, 연구하고, 사용하고 /해야 할 것에 대한 조언이 있습니까? 미리 감사드립니다.

+0

당신이 염두에두고있는 일반적인 형식은 무엇입니까? XML을 사용하면 효과가 있습니까? –

답변

0

파일 형식에 제한이있는 경우 XML 또는 JSON을 사용하여 문법을 설명 할 수 있습니다.

당신은, 당신은 다음 실제 개체가 것이라고 다른 파일에서 읽을 수 있습니다 (대부분, 일부 기존 라이브러리를 사용)

{ 
    "ObjectTypes" : { 
     "ruler" : { "properties" : [ "length" ] }, 
     "color" : { "properties" : [ "red", "green", "blue" ] } 
    } 
} 

같은이 파일에 읽고 나면 보이는 문법 파일을 가질 수 .

{ 
    "Objects" : [ 
     { name : "object1", "type" : "ruler", "length" : 5 }, 
     { name : "object2", "type" : "color", "red" : 5, "blue" : 127, "green" : 150, } 
    ] 
} 

등 : 그것은 다음과 같이 보일 수 있습니다. JSON에 대한 더 자세한 설명은 here으로, JSON을 다루는 여러 C++ 라이브러리에 대한 링크가 포함되어 있습니다 (개인적으로 가장 좋아하는 것은 JsonCpp).

+0

JSON과 XML을 사용해 보았습니다. 그러나 이해하는 한 선택적 매개 변수 또는 교환 할 수있는 매개 변수 (이것 또는 그 것)를 지원하지 않습니다. 또한 다른 객체의 내부에서 정의 된 객체를 사용할 수 없습니다. '오브젝트 1 : \t 항목 1 : 예를 들어 \t \t 유형 : \t \t \t 수 \t \t 설명 : \t \t \t 먼저 설명 \t \t 옵션 : \t \t \t 옵션 1 \t \t \t 옵션 2 \t 항목 2 : \t \t 유형 : \t \t \t Object2 \t \t 설명 : \t \t \t 두 번째 설명 \t 항목 3 : \t \t 유형 : \t \t \t, 오브젝트 4 \t \t 설명 : \t \t \t 두 번째 설명 \t \t Object1 구성 : \t 선택 사항 (Item1) + (Item2 OR Item3) ' 등등. 내가 어떻게하는지 보지 못하면 나는 다시 행복하게 노력할 것이다. – Svalorzen

+0

불행히도 나는 그것을 더 잘 편집 할 수있는 문자가 충분하지 않지만 내용이 이해되기를 바랍니다. @Datalore – Svalorzen

+0

"선택 매개 변수"또는 "상호 교환 가능 매개 변수"란 무엇을 의미하는지 이해할 수 없습니다. JSON 객체 내에 임의의 키/값 쌍을 가질 수 있고 JSON 배열 내에 임의의 목록을 포함 할 수 있습니다 (상호 중첩 됨). 하나의 JSON 객체에서 어떤 종류의 명세를 읽을 수 있고 그 명세를 사용하여 C++ 프로그램이 다른 JSON 객체 세트를 읽고 그것으로 무언가를 할 수 있도록 지시 할 수있다. – Datalore

1

런타임시 제공된 문법에서 추출한 사실을 사용하여 컨텍스트가없는 언어를 구문 분석하는 Earley parsers을 참조하십시오.

사실상 모든 C++ 컴파일러 시스템이 프로세스를 포크 할 수있는 라이브러리를 제공한다는 사실을 사용할 수도 있습니다. 이를 사용하여 원하는 구문 분석기 형식 (부스트 : Spirit, 스크립트에서 C++ 컴파일러를 호출해야하지만 열심히하지 않아야 함)을 실행하는 셸 스크립트를 포크하고 해당 스크립트를 가질 수 있습니다 생성 된 파서를 호출한다. 처리 할 문서가 많으면 Earley 파서보다 효율적입니다. 확실히 구현하기가 훨씬 쉬울 것입니다.

+0

당신의 포크 솔루션은 다소 불편할 것 같습니다. 불행히도 (나는 틀릴 수도 있습니다.) Earley 파서를 살펴 보겠습니다. 링크를 이용해 주셔서 감사합니다! – Svalorzen

+0

당신이 어디로 향하는 지에 달려 있습니다. Flex/Bison은 널리 사용 가능하며 포크는 표준 기본 요소입니다. –

관련 문제