Thread: [Pyparsing] setResultsName() not working as expected
Brought to you by:
ptmcg
From: cathal c. <cof...@gm...> - 2011-07-02 20:18:14
|
Guys, I have the following but I don't like it because I am basically repeating code just to change the results name depending on the situation. field = '$' + Combine(Word(alphanums)).setResultsName('field_name') as_field = '$' + Combine(Word(alphanums)).setResultsName('new_field_name') I would much prefer to do something like this. field = '$'.suppress() + Combine(Word(alphanums)) as_field = field.copy() field.setResultsName('field_name') as_field.setResultsName('new_field_name') The second however doesn't parse as expected. Why aren't the two of these equivalent? Kind regards, Cathal |
From: cathal c. <cof...@gm...> - 2011-07-02 22:23:59
|
I made a typo in my first email the line field = '.suppress() + Combine(Word(alphanums)) should read field = Literal(').suppress() + Combine(Word(alphanums)) However this still doesn't solve my problem. Can you please explain why the two code snippets shown in the first email aren't equivalent? |
From: Paul M. <pt...@au...> - 2011-07-02 22:56:53
|
Instead of: field = '$' + Combine(Word(alphanums)).setResultsName('field_name') as_field = '$' + Combine(Word(alphanums)).setResultsName('new_field_name') how about: anumExpr = Combine(Word(alphanums)) field = '$' + anumExpr.setResultsName('field_name') as_field = '$' + anumExpr.setResultsName('new_field_name') setResultsName is an unfortunate method name and I have regretted it almost since version 0.9. setResultsName is not really a mutator or 'setter' on an expression - it is really a copy method that makes a copy of the expression and then sets the return name behavior onthe copy. You should read 'setResultsName' as 'copyAndReturnResultsWithTheName'. The reason for this is that I wanted a single expression to be able to be used multiple times but with different semantic values in the overall parser. Let's say I was parsing a record with an criminal identifier, and various numbers of different types of crimes: ident = Word(alphanums) integer = Word(nums) criminalRec = ident("id") + integer("mis_A") + integer("mis_B") + integer("felony_A") + integer("felony_B") + integer("felony_C") (Note that I'm using the new form of setResultsName, which makes this much easier to follow than: criminalRec = ident.setResultsName("id") + integer.setResultsName("mis_A") + integer.setResultsName("mis_B") + integer.setResultsName("felony_A") + integer.setResultsName("felony_B") + integer.setResultsName("felony_C") If setResultsName was just a setter, than these multiple references to integer would clash with each other. So setResultsName has to act on a copy of the expression, not on the expression itself. So I would suggest this variation on your original parser: anumExpr = Combine(Word(alphanums)) field = '$' + anumExpr('field_name') as_field = '$' + anumExpr('new_field_name') (For that matter, Combine is only useful when there are several expressions to combine into a single token - it is unnecessary here. Just do: anumExpr = Word(alphanums) -- Paul -----Original Message----- From: cathal coffey [mailto:cof...@gm...] Sent: Saturday, July 02, 2011 3:18 PM To: pyp...@li... Subject: [Pyparsing] setResultsName() not working as expected Guys, I have the following but I don't like it because I am basically repeating code just to change the results name depending on the situation. field = '$' + Combine(Word(alphanums)).setResultsName('field_name') as_field = '$' + Combine(Word(alphanums)).setResultsName('new_field_name') I would much prefer to do something like this. field = '$'.suppress() + Combine(Word(alphanums)) as_field = field.copy() field.setResultsName('field_name') as_field.setResultsName('new_field_name') The second however doesn't parse as expected. Why aren't the two of these equivalent? Kind regards, Cathal |
From: cathal c. <cof...@gm...> - 2011-07-02 23:19:17
|
Paul, I much prefer the new form of setResultsName(), its much more elegant. Thank you for the descriptive example, it really aided in my understanding. I've been building a project using pyparsing for about a month now. In this time I have learnt so much about pyparsing that I keep rewriting my project: making it faster, more expressive and succinct. Thank you for pyparsing, I haven't had this much fun in ages. Cathal (from Ireland) |