2016-01-14 3 views
1

Je voudrais commencer avec Grako (3.6.6) et comme une première expérience avec les parseurs je voulais générer un tableau HTML à partir d'une syntaxe personnalisée. Le test de base suivantExemple de base Grako donne IndexError

import grako 

grammar = """table = { row }+ ; 
row = (cell1:cell "|" cell2:cell) "\n"; 
cell = /[a-z]+/ ; 
""" 

model = grako.genmodel("model", grammar) 

ast = model.parse(
"""a | b 
c | d 
""", "table") 
print(ast) 

provoque une erreur

File "test.py", line 13, in <module> 
    """, "table") 
    File "grako\grammars.py", line 790, in grako.grammars.Grammar.parse (grako\grammars.c:27773) 
    File "grako\grammars.py", line 97, in grako.grammars.GrakoContext.parse (grako\grammars.c:4391) 
    File "grako\contexts.py", line 180, in grako.contexts.ParseContext.parse (grako\contexts.c:4313) 
    File "grako\grammars.py", line 594, in grako.grammars.Rule.parse (grako\grammars.c:22253) 
    File "grako\grammars.py", line 597, in grako.grammars.Rule._parse_rhs (grako\grammars.c:22435) 
    File "grako\contexts.py", line 399, in grako.contexts.ParseContext._call (grako\contexts.c:10088) 
    File "grako\contexts.py", line 433, in grako.contexts.ParseContext._invoke_rule (grako\contexts.c:11135) 
    File "grako\grammars.py", line 435, in grako.grammars.PositiveClosure.parse (grako\grammars.c:17285) 
    File "grako\contexts.py", line 695, in grako.contexts.ParseContext._positive_closure (grako\contexts.c:19286) 
    File "grako\contexts.py", line 696, in grako.contexts.ParseContext._positive_closure (grako\contexts.c:19240) 
    File "grako\grammars.py", line 435, in grako.grammars.PositiveClosure.parse.lambda10 (grako\grammars.c:17195) 
    File "grako\grammars.py", line 547, in grako.grammars.RuleRef.parse (grako\grammars.c:20774) 
    File "grako\grammars.py", line 594, in grako.grammars.Rule.parse (grako\grammars.c:22253) 
    File "grako\grammars.py", line 597, in grako.grammars.Rule._parse_rhs (grako\grammars.c:22435) 
    File "grako\contexts.py", line 399, in grako.contexts.ParseContext._call (grako\contexts.c:10088) 
    File "grako\contexts.py", line 433, in grako.contexts.ParseContext._invoke_rule (grako\contexts.c:11135) 
    File "grako\grammars.py", line 326, in grako.grammars.Sequence.parse (grako\grammars.c:11582) 
    File "grako\grammars.py", line 268, in grako.grammars.Token.parse (grako\grammars.c:9463) 
    File "grako\contexts.py", line 543, in grako.contexts.ParseContext._token (grako\contexts.c:13772) 
    File "grako\buffering.py", line 301, in grako.buffering.Buffer.match (grako\buffering.c:9168) 
IndexError: string index out of range 

qui se trouve être partial_match = (token[0].isalpha() and token.isalnum() and self.is_name_char(self.current()))

Malgré moi d'être de nouveau à parseurs et un petit manque de documentation, je voudrais rester à Grako.

Pouvez-vous m'aider à mettre en place un exemple de base qui génère le code HTML pour une table?

Répondre

2

Grako ne voit pas la "\n" dans la grammaire correctement parce que les nouvelles lignes ne sont pas autorisés dans les jetons, et le \n est en cours d'évaluation dans le contexte de l'extérieur, triple guillemet ("""), chaîne. Les choses fonctionnent bien si vous utilisez /\n/ à la place.

Notez également que si \n fera partie de la langue, alors vous devriez probablement écrire une clause @@whitespace si l'analyseur ne saute pas sur le caractère:

@@whitespace :: /[\t ]+/ 

Ceci est la grammaire correcte pour votre langue :

grammar = """ 
@@whitespace :: /[\t ]+/ 
table = { row }+ ; 
row = (cell1:cell "|" cell2:cell) "\\n"; 
cell = /[a-z]+/ ; 
""" 

Je rapiéçage actuellement Grako pour détecter et signaler des erreurs comme celui de votre grammaire. Les modifications sont déjà dans le référentiel Bitbucket. Je vais faire une sortie après avoir fini les tests.

+0

Oh, je vois. Merci! Pourriez-vous me montrer un exemple (avec une ligne de code) où l'AST est traduit en une sortie de chaîne (Renderer, non?)? J'ai parcouru les exemples liés, mais il est difficile d'extraire la partie pertinente sans avoir beaucoup d'expérience avec l'analyse syntaxique. – Gerenuk

+0

Pour les traductions complexes, j'utilise '' grako.model''. Mais les ASTs produites par ** Grako ** sont faciles à utiliser de plusieurs façons différentes, alors je vous suggère de faire votre propre pour votre langage simple. Cela vous permettra d'apprendre ce que vous voulez comme support pour la traduction dans une bibliothèque, et ainsi vous permettre d'approcher '' grako.model'' plus facilement. – Apalala