Je travaille sur un analyseur de python en utilisant ply et je dois analyser l'entrée sous forme de:PLI: Caractère illégal « + »
VAR VAR1 001
+000 000 000 000
Lorsque le code créerait une variable nommée VAR 1 puis attribuez-lui la la valeur 0 à ce
le regex j'ai écrit pour l'instanciation est:
t_INST = r'[\+|-]0[ ][0-9][0-9][0-9][ ][0-9][0-9][0-9][ ][0-9][0-9][0-9][ ][0-9][0-9][0-9]'
Cependant lors de l'exécution de mon programme, imprime PLY les éléments suivants:
Illegal character '+'
A reproducer suit:
import ply.lex as lex
tokens = ['INST']
t_INST = r'[+-]0[ ](\d{3}[ ]){3}\d{3}';
t_ignore = ' \t'
def t_error(t):
print("Illegal character '%s'" % t.value[0])
t.lexer.skip(1)
lexer = lex.lex()
def parse(input_string):
ret = []
lexer.input (input_string)
while True:
tok = lexer.token()
if not tok:
break # No more input
ret.append((tok.type, tok.value))
return ret
print parse("+0 000 000 000")
Vous devez utiliser \ d pour désigner les caractères et également utiliser {} pour désigner des séquences répéter: [\ + -] (: \ d {3} \ s? {4} – Neil
Pourquoi le backslash? Vous voudriez cela dans un contexte normal, mais cela n'a pas de sens dans une classe de personnage.En fait, sauf si '|' est un premier caractère valide, vous voulez probablement '[+ -]', pas '[+ | -]', aussi. –
BTW, il serait utile d'avoir votre reproducteur - tout en restant aussi * minimal * que possible - être étendu au point où il est * complet * et * vérifiable *, comme indiqué dans http://stackoverflow.com/ aide/mcve À l'heure actuelle, quelqu'un doit faire assez de travail pour reproduire le bogue. –