1

次のようなファイルを解析する必要があります。

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行のテストファイルを問題なく解析します。ただし、カスタム文法を書くのは初めてなので、正しく書いているかどうかはわかりません。

上記の文法に改善を加えることができますか?

4

1 に答える 1

4

以下は、パフォーマンスを向上させるために変更を要求するいくつかの変更です

1)文法を左再帰規則にします。ゴールドパーサーはシフトリデュースLRパーサーであるため、これはシフトリデュース操作を行うという点で優れています。

SectionList::=セクション

           |   SectionList Section

PropertyList::=プロパティ

            | PropertyList Property

2)以下のセクションの3番目のルールでは、プロパティリストをセクションリストの前にのみ設定し、異なるの間には設定しないように強制します。要件に従ってそれを確認してください

SectionBody :: = PropertyList

           |  SectionList

           |  PropertyList SectionList

私は必要に応じてあなたをより良く助けることができます、そしてあなたがあなたの言語の100%の絵を与えないサンプル入力ではなく「これを受け入れるべきである、これを受け入れるべきではない」と言っている言語を私に知らせれば。または、言語の説明も定義できるバグを教えてください。

よろしく、VM Rakesh(rakesh.vm@gmail.com)

于 2011-04-26T18:48:55.390 に答える