Il mio obiettivo è analizzare come Python fa con le stringhe.Stringhe Lex con virgolette singole, doppie o triple
Domanda: Come scrivere un lex per supportare quanto segue:
"string..."
'string...'
"""multi line string \n \n end"""
'''multi line string \n \n end'''
Alcuni c ode:
states = ( ('string', 'exclusive'), ) # Strings def t_begin_string(self, t): r'(\'|(\'{3})|\"|(\"{3}))' t.lexer.push_state('string') def t_string_end(self, t): r'(\'|(\'{3})|\"|(\"{3}))' t.lexer.pop_state() def t_string_newline(self, t): r'\n' t.lexer.lineno += 1 def t_string_error(self, t): print("Illegal character in string '%s'" % t.value[0]) t.lexer.skip(1)
La mia idea attuale è di creare 4 stati unici che abbineranno i 4 diversi casi di stringa, ma mi chiedo se c'è un approccio migliore.
Grazie per il vostro aiuto!
avete 4 tipi di stringa distinti quindi mi aspetterei che si avrebbe bisogno di 4 stati diversi. Presumibilmente '' 'stringa' '' è mal formata? – nimish
Si possono usare due stati univoci, uno per le virgolette singole e uno per le virgolette triple, ma è necessario memorizzare il carattere virgolette da qualche parte.E 'discutibile quale metodo sia migliore. – Thayne
Avevo paura di costruire 4 stati ... Possono funzionare due? Perché gli stati di inizio/fine non corrispondono al tipo di preventivo iniziale iniziale Ex '" string ..'... stringa ... "" il parser vedrà " string..' come stringa, quindi vedere '... stringa ..." 'come errore di analisi. –