2010-07-25 13 views
1

Я должен разобрать файл, который выглядит следующим образом:Могу ли я улучшить эту грамматику GOLD Parser?

versioninfo 
{ 
    "editorversion" "400" 
    "editorbuild" "4715" 
} 
visgroups 
{ 
} 
world 
{ 
    "id" "1" 
    "mapversion" "525" 
    "classname" "worldspawn" 
    solid 
    { 
     "id" "2" 
     side 
     { 
      "id" "1" 
      "plane" "(-544 -400 0) (-544 -240 0) (-272 -240 0)" 
     } 
     side 
     { 
      "id" "2" 
      "plane" "(-544 -240 -16) (-544 -400 -16) (-272 -400 -16)" 
     } 
    } 
} 

У меня есть парсер написанный с нуля, но у него есть несколько ошибок, которые я не могу отслеживать вниз, и я предполагаю, что это будет трудно если формат изменится в будущем. Вместо этого я решил использовать GOLD Parsing System для генерации парсера. Моя грамматика выглядит так:

"Start Symbol" = <SectionList> 

! SETS 

{Section Chars} = {AlphaNumeric} + [_] 
{Property Chars} = {Printable} - ["] 

! TERMINALS 

SectionName = {Section Chars}+ 
PropertyPart = '"' {Property Chars}* '"' 

! RULES 

<SectionList> ::= <Section> 
       | <Section> <SectionList> 

<SectionBody> ::= <PropertyList> 
       | <SectionList> 
       | <PropertyList> <SectionList> 

<Section> ::= SectionName '{' '}' 
      | SectionName '{' <SectionBody> '}' 

<PropertyList> ::= <Property> 
       | <Property> <PropertyList> 

<Property> ::= PropertyPart PropertyPart 

Ошибок нет и он отлично разбирает мой тестовый файл 2000 строк. Тем не менее, это мой первый раз, когда я пишу пользовательскую грамматику, поэтому я не уверен, правильно ли я делаю это.

Есть ли улучшения, которые я мог бы внести в грамматику выше?

ответ

4

Ниже приведены некоторые изменения я хотел бы просить, чтобы изменить для улучшения производительности

1) делают грамматика леворекурсивным правила. это лучше с точки зрения принятия операций по сокращению смены, так как парсер золота - это парсер пар LR.

SectionList :: = Раздел

  | SectionList Section 

PropertyList :: = Свойство

  | PropertyList Property 

2) третье правило в разделе ниже заставляет вас иметь propertylist только перед sectionlist, но не между различными «с. убедитесь, что его согласно требованию

SectionBody :: = PropertyList

  | SectionList 

      | PropertyList SectionList 

я могу помочь вам лучше, если требуется, и если вы дайте мне знать язык, говоря «он должен принять это, не следует принимать это» а не образец ввода, который не даст 100% изображения вашего языка. или дайте мне знать ошибки, которые вы почувствовали, из которых мы также можем определить описание языка.

С уважением, V M Rakesh ([email protected])