2013-10-04 5 views
-1

나는이 거대한 Maude 문자열을 가지고 있습니다.파서 작성 방법은 무엇입니까?

NamedElements 
( 
    (
     NamedElement 
     (
      SpecTable 
      (
       SpecColumns 
       (

        (
         SpecColumn 
         (
          Name 
          (
           "Id" 
          ) 
          , 
          TypeVarChar 
          (
           18 
          ) 

         ) 
         , 
         SpecColumn 
         (
          name 
          (
           "IsDeleted" 
          ) 
          , 
           DataTypeBit 
         ) 

... ...

단 한 가지라고 NamedElements있다 : 이것은 그것의 작은 조각이다. 여기에는 많은 NamedElement 객체가 있습니다. 형식은 이해하기 쉽습니다. 이를 위해 파서 (parser)를 작성하여 Name과 같은 이름을 가진 모든 SpecColumn 객체를 얻는 것과 같은 작업을 수행 할 수 있어야합니다. 나는 이것을하는 최고의 방법을 확신하지 못한다.

내가 생각 한 몇 가지 :... 나는이 '('나는 새로운 객체가 나는 위의 객체에 속성으로이 개체를 추가 할 찾을 때까지 각 문자를 통해

루프가 나는 지속될 일치하는 찾을 때까지 ')'. 그러면 해당 객체에있는 내용이 마무리됩니다.

는 기본적으로, 내가 전에 이런 일을 해본 적이 없다,이 일을 몇 가지 설정 방법이 있는지 궁금 해서요, 또는 내가 위에서 설명한 것처럼 뭔가를해야 할 것인가?

+0

https://en.wikipedia.org/wiki/Recursive_descent_parsing –

+1

죄송합니다,이 질문에 잘 스택 오버플로의 범위에 적합하지 않지만, 여기에 몇 가지 제안 사항 : 1. 구글은 "재귀 하강 파서 ", 가장 쉬운 파싱 기술이며 많은 예제 구현을 찾을 수 있습니다. 2. 내가 작성한 [지나치게 간단한 JSON 구문 분석기] (https://github.com/H2CO3/libjsonz/tree/master/src/jsonz.c)를 살펴보십시오. –

+0

문법을 지정하는 데 사용할 수있는 훌륭한 라이브러리가 있습니다. 언어에 대한 아이디어는 더 많은 지침을 제공하는 데 도움이되지만, C++에 대한 나의 추천이 될 것입니다. 그것도 놀라 울 정도로 빠릅니다. – OllieB

답변

1

당신이 당신의 문법과 구문을 정의 할 필요가 파서 쓰기하려면 : 당신이 사용할 수있는 단어와 어떻게 그 단어가 문장을 만들기 위해 함께 넣을 수 있습니다. 이는 XML 또는 JSON과 비슷한 객체 마크 업과 비슷합니다. 그러나 파서를 작성하려면 먼저 언어를 정의해야합니다.

는 파서를 작성, 당신은 lexical analysis에 보일 것입니다. 시작하기 좋은 곳입니다. 일단 당신이 당신의 언어에 무엇이 있는지 알게되면, 당신은 그것을 "파싱"하고 그것을 다른 언어, 형식 등 무엇이든간에 당신이 원하는 다른 것으로 변환 할 수 있습니다.

파서는 스캐너 tokenizers 및 렉서로 구성된다. 나는이 모든 것이 다소 모호하다는 것을 압니다. 그러나 당신의 질문은 꽤 열려 있습니다.

0

난 당신이 문법을 조금 공식화 건의 할 것입니다.

Name  ::= ("STRING") 

TypeVarChar ::= (NUMBER) 

DataTypeBit ::= DATATYPEBIT 

SpecColumn ::= (Name {, TypeVarChar | DataTypeBit}) 

SpecColumns ::= (SpecColumn {, SpecColumn}*) 

SpecTable ::= (SpecColumns)