Могу ли я улучшить эту грамматику 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 для генерации парсера. Моя грамматика выглядит так:
"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 ответ
Ниже приведены некоторые изменения, которые я бы попросил изменить для повышения производительности
1) сделать из грамматики левые рекурсивные правила. это лучше с точки зрения выполнения операций уменьшения сдвига, так как анализатор gold является анализатором уменьшения LR сдвига.
SectionList:: = Раздел
| SectionList Section
PropertyList:: = Недвижимость
| PropertyList Property
2) третье правило в разделе ниже заставляет вас иметь список свойств только перед разделом списка, но не между различными. убедитесь, что согласно требованию
SectionBody::= PropertyList
| SectionList
| PropertyList SectionList
я могу помочь вам лучше, если потребуется, и если вы дадите мне знать язык, говорящий "он должен принять это, не должен принять это", а не образец ввода, который не даст 100% картину вашего языка. или дайте мне знать о найденных вами ошибках, из-за которых мы можем определить описание языка.
С уважением, В.М. Ракеш (rakesh.vm@gmail.com)