2009-06-10 7 views
1

응용 프로그램의 구성 파일 (일반 텍스트 및 줄 기반 -> EOL = 한 구성)에 대해 자체 파일 형식을 개발했습니다. 이 형식은 특별하지 않으며 내가 이것을하는 유일한 이유는 무엇인가를 배우는 것입니다! 리더와 라이터 함수는 C로 구현 될 것입니다 (GLib는 UTF8로 인코딩 된 파일이어야하기 때문에).자신의 작성 방법 Configformat

이제 C 코드에서이 형식을 구현하는 방법에 대해 생각하고 있습니다. 가능한 한 좋은 오류 메시지를 얻으려면 어떻게해야합니까? 나는 Lexer, Parser에 관해 뭔가를 들었다. 그러나 결코 그렇게 깊이 들어 가지 않았다. 나는 그것들에 대한 추상적 인 아이디어만을 가졌어. 그럼 C 형식으로 작성된 깨끗한 독자를 얻으려면 어떤 단계를 거쳐야합니까? 앞으로의 변경에도 유지 보수가 가능합니까? 배우고 생각할 주제는 무엇입니까?

예, 저는 알고 있습니다. C는 고통스럽고, 이것에 대한 다른 "섹시한"형식이 많이 있습니다. 나는 뭔가 배우고 싶다!

건배, 그레고르


추가 정보

  • 리더/라이터/파서 (또는 무엇이든이 호출)는 타사 프로그램에 가능한 한 조금에 의존해야/구성 요소. 이 설정 부분 주위의 응용 프로그램은 이미 GLib을 사용하므로 whib의 GLib가 UTF8에도 사용됩니다.
+1

루아를 사용하도록 권장합니다. 설정 파서로 사용할 수있는 가벼운 동적 언어입니다 ;-) 루아 사이트에는 config로 사용하는 방법에 대한 문서가 있습니다 .-) –

답변

1

소스 코드는 libconfig입니다. 그것은 당신이 시작 지점으로 사용할 수있는 가벼운 파서를 가지고 있으며, 아마도 당신이 자신의 형식에 대한 파서가 어떻게 생겼는지를 알아 내는데 도움이 될 것입니다.

정말로 파서와 렉서에 대해 배우고 싶다면 간단한 컴파일러를 구현하는 것이 좋습니다. 따라 할 수있는 것은 MIT course입니다.

+0

미안하지만, 나는 당신의 대답을 간과하고 있습니다. Libconfig는 거의 1 : 1 구성 파일 형식입니다 :-). 큰! 이것은 나의 동료들을 행복하게 만들 것이고 나는 대답들과 libconfig의 안쪽에있는 모든 링크들/아이디어들을 탐색 할 더 많은 시간을 가질 것이다. – Gregor

1

문제를 깊이있게 배우고 싶다면 수동으로 파서를 작성하지 말아야한다고 생각해야합니다. 물론 그렇게 할 수는 있지만 더 복잡한 작업이 될 것입니다. 그리고 언어에 새로운 기능을 추가하면 렉서와 파서 코드를 항상 적용하는 문제가 발생할 것입니다.

좋은 점은 입력 및 구조에 대한 높은 수준의 설명에서이 항목을 생성 할 수있는 많은 도구가 있다는 것입니다. 그렇게 할 표준 * nix 도구는 Lex와 Yacc (또는 그 자손 Flex와 Bison)이지만 대신 ANTLR (http://www.antlr.org)을 알려 드리고자합니다. 좋은 기능 중 하나는 다양한 언어 (C/C++뿐만 아니라 Java, Python, Ruby, C#, ...)에 백엔드를 제공하므로 전환 방법을 배우면 전환하는 데 도움이된다는 것입니다 나중에 언어.

+0

ANTLR 매우 intresting 것은. 그래서 다른 언어로 된 설정 파일을위한 도구를 쉽게 제공 할 수 있습니다. – Gregor

5

구성 형식을 만드는 멋진 방법 중 하나는 스크립팅 언어를 포함시키는 것입니다.

이 당신에게 무료로 파서를 제공하고 당신에게 재사용되는 변수 즉석에서 데이터를 생성하거나 정의 할 수 있습니다 :

<InputPoints> 
    <Point> 
    <x>1.0</x> 
    <y>1.0</y> 
    </Point> 
    <Point> 
    <x>1.0</x> 
    <y>2.0</y> 
    </Point> 
    <Point> 
    <x>1.0</x> 
    <y>3.0</y> 
    </Point> 
    <Point> 
    <x>1.0</x> 
    <y>4.0</y> 
    </Point> 
<InputPoint> 
:

이 못생긴 의사 스크립트 언어 대 XML의 예제를 고려를

대 :

for(i = 1; i <= 4; ++i) { 
    InputPoint(1, i); 
} 

혹은

VS

user = "allanballan"; 
Username = user; 
Accountname = user; 
HomeDirectory = "/home/"+user; 

첫번째 예는 몇 문 포인트의리스트를 압축하고, 상기 제로서는 임시 변수를 이용하여 중복 된 데이터를 많이 제거하는 방법.

이런 종류의 상황에 대해 널리 사용되는 언어는 Lua입니다. 스크립팅 언어를 구성에 정확히 매핑하는 방법은 통합 업체에 달려 있지만 실제로는 강력하고 파싱 및 유형 검사는 무료입니다.

+0

(+1) 스크립팅 언어에 의존하는 구성 파일에 대한 좋은 지적입니다. 나는 이미 이런 종류의 것을 사용했고 그것은 훌륭합니다. 그러나 제 제안으로는 너무 많이합니다. 가능한 한 다른 프로그램에 의존해야합니다. – Gregor

+0

tcl 또한 좋은 선택입니다. API는 매우 간단하며 구문은 종종 구성 파일에 적합합니다. – falstro