Je développe un analyseur pour le langage DOT et j'ai des problèmes avec les instructions "subgraph".Erreur de correspondance la plus longue de pypars suspectée
Je n'ai aucun problème pour que mon expression d'analyse SUBGRAPH fonctionne correctement (voir le fragment ci-dessous). Cependant, lorsque je l'ajoute comme alternative dans STMT, elle ne correspond pas.
Test simple:
test = '''subgraph cluster01 { n003 ; n004 ; }'''
FRAG_1 = SUBGRAPH + StringEnd()
FRAG_2 = STMT + StringEnd()
res1 = FRAG_1.parseString(test) # OK
res2 = FRAG_2.parseString(test) # ParseException -
Erreur:
subgraph cluster01 { n003 ; n004 ; }
^
ERROR: Expected end of text (at char 9), (line:1, col:10)
Je suspect le problème implique mon expression Stmt - qu'il correspond cupides le mot-clé "de subgraph" comme NODE_STMT Plutôt que de faire une correspondance en SUBGRAPH, je m'attends à ce que l'utilisation d'une expression "Or" ("^") permette à l'algorithme de correspondance le plus long de choisir SUBGR APH sur NODE_STMT. Ou ça pourrait être autre chose.
Ma grammaire partielle est ci-dessous:
Grammaire Fragment:
LCURL = Literal("{").suppress()
RCURL = Literal("}").suppress()
STMTSEP = Literal(";").suppress()
ID = Word(alphas, alphanums + "_")
SUBGRAPH_KW = Keyword("subgraph", caseless=True)
SUBGRAPH = Forward("SUBGRAPH")
NODE_ID = ID("NODE_ID")
NODE_STMT = NODE_ID("NODE")
STMT = NODE_STMT("NODE")^SUBGRAPH("SUBGRAPH")
STMT_LIST = ZeroOrMore(STMT("STMT") + Optional(STMTSEP))
SUBGRAPH << Group(SUBGRAPH_KW + ID("SUBGRAPHNAME")) + Group(LCURL + STMT_LIST + RCURL)
Brillant! Je vais devoir penser à ce que l'utilisation correcte de ParserElement.setResultName() est réellement si ... – SMagrath
Bonne prise!Je n'ai pas vu ce problème particulier surgir sous cette forme particulière avant (nom de résultats + Forward), certainement besoin d'ajouter à ma liste de getchas pyparsing. – PaulMcG