2010-07-25 15 views
1

je dois analyser un fichier qui ressemble à ceci:Puis-je améliorer cette grammaire PARser GOLD?

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)" 
     } 
    } 
} 

J'ai un analyseur écrit à partir de zéro, mais il a quelques bugs que je ne peux pas traquer et j'imagine que ce sera difficile de maintenir si le format change dans le futur. J'ai décidé d'utiliser le système d'analyse d'or pour générer un analyseur à la place. Ma grammaire ressemble à ceci:

"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 

Il n'y a pas d'erreurs et parse mon fichier de test 2000 en ligne très bien. Cependant, c'est la première fois que j'écris une grammaire personnalisée, donc je ne suis pas sûr de la faire correctement.

Y a-t-il des améliorations que je pourrais apporter à la grammaire ci-dessus?

Répondre

4

Voici quelques changements que je voudrais demander de changer pour de meilleures performances

1) faire la grammaire gauche règles récursives. cela est mieux en termes de réduction des opérations de décalage que l'analyseur d'or est un changement de réduire LR parser.

SectionList :: = Section

  | SectionList Section 

PropertyList :: = troisième règle Propriété

  | PropertyList Property 

2) en dessous de forces de la section que vous avez PropertyList seulement avant SectionList mais pas entre les différents « s. assurez-vous que son exigence selon

SectionBody :: = PropertyList

  | SectionList 

      | PropertyList SectionList 

je peux vous aider à mieux si nécessaire, et si tu me laisses connaître la langue en disant « il faut accepter cela, ne devrait pas accepter cette » plutôt qu'un exemple d'entrée qui ne donnera pas 100% d'image de votre langue. ou laissez-moi savoir les bugs que vous avez ressenti à partir de laquelle nous pouvons définir la description de la langue aussi.

Cordialement, V M Rakesh ([email protected])