Могу ли я улучшить эту грамматику GOLD Parser? - PullRequest
1 голос
/ 25 июля 2010

Мне нужно проанализировать файл, который выглядит следующим образом:

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 для генерации парсера.Моя грамматика выглядит следующим образом:

"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-строчный тестовый файл.Однако я впервые пишу собственную грамматику, поэтому я не уверен, правильно ли я это делаю.

Могу ли я внести какие-либо улучшения в приведенную выше грамматику?

1 Ответ

4 голосов
/ 26 апреля 2011

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

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

SectionList :: = Section

           |   SectionList Section

PropertyList :: = Недвижимость

            | PropertyList Property

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

SectionBody :: = PropertyList

           |  SectionList

           |  PropertyList SectionList

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

С уважением, В.М. Ракеш (rakesh.vm@gmail.com)

...