2013-10-04 3 views
-1

У меня есть эта гигантская веревка Мод. Это небольшой кусочек его:Как я могу написать парсер?

NamedElements 
( 
    (
     NamedElement 
     (
      SpecTable 
      (
       SpecColumns 
       (

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

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

... ...

Существует только одна вещь, которую называют NamedElements. В нем много объектов NamedElement. Формат прост для понимания. Мне нужно написать синтаксический анализатор для этого, чтобы я мог сделать что-то вроде получения всех объектов SpecColumn, у которых есть Имя, которое равно чему-то. Я не уверен, что это лучший способ сделать это.

Некоторых вещей я думал о:...

Цикла по каждому символу, пока я не найти «(» Я делаю новый объект добавить этот объект в качестве свойства на выше этом объекте я продолжаю идти пока не найду совпадение ')'. Затем это завершает то, что находится в этом объекте.

В принципе, я никогда не делал ничего подобного раньше, и задавался вопросом, существует ли какой-то определенный способ сделать это, или мне нужно будет сделать что-то вроде того, что я описал выше?

+0

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

+1

К сожалению, этот вопрос не вписывается сферы переполнению стека, но вот несколько советов: 1. Google «метод рекурсивного спуска ", это самый простой метод синтаксического анализа, и вы найдете довольно много примеров реализации. 2. Посмотрите на [чрезмерно простой парсер JSON] (https://github.com/H2CO3/libjsonz/tree/master/src/jsonz.c), который я написал. –

+0

Есть несколько отличных библиотек, доступных для такого рода вещей, где вы указываете грамматику. Идея языка была бы полезна для того, чтобы дать больше указаний, но усиление духа будет моей рекомендацией для C++. Это также удивительно быстро. – OllieB

ответ

1

Чтобы написать синтаксический анализатор, вы должны определить свою грамматику и синтаксис: слова, которые вы можете использовать, и как эти слова могут быть объединены для создания утверждений. Это выглядит в основном как разметка для объектов, аналогичная XML или JSON. Но все же вам нужно определить свой язык, прежде чем писать парсер.

При написании парсера вы должны посмотреть на lexical analysis. Это хорошее место для начала. Когда вы знаете, что есть и чего нет на вашем языке, вы можете «разобрать» его и преобразовать в любую другую вещь, которую хотите, будь то на другом языке, в формате, что угодно.

Parsers состоит из сканеров, токенизаторов и лексера. Я знаю, что все это немного расплывчато, но ваш вопрос достаточно открытый.

0

Я бы посоветовал вам немного оформить грамматику.

Name  ::= ("STRING") 

TypeVarChar ::= (NUMBER) 

DataTypeBit ::= DATATYPEBIT 

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

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

SpecTable ::= (SpecColumns) 

и т.д.

Смежные вопросы