Re: [Pyparsing] [Fwd: 1. .suppress() does not work; 2. a new API call suggestion]
Brought to you by:
ptmcg
From: Paul M. <pt...@au...> - 2015-07-28 12:55:53
|
Since you are using LabelNameLineParser as a more complete parser of the results from LabelNameLine, you can't add the lambda as a condition (which only evaluates whether the condition holds, but does *not* modify the parsed results), you have to add it as a parse action. If you use the LabelNameLineParser in a parse action, then the results of the more complex parser will be returned - addCondition just raises or doesn't raise ParseException. Change this line: LabelNameLine = Line.copy().addCondition(lambda self, loc, toks: LabelNameLineParser.parseString(toks[0], True)) To: LabelNameLine = Line.copy().addParseAction(lambda self, loc, toks: LabelNameLineParser.parseString(toks[0], True)) With this change, I get these results: ['chap-filt'] ['filt-eq-char'] ['fmslat-filt'] ['fmslat-two'] ['fmslat-one'] ['up-straight'] ['thm1:prim-exists'] ['free-alt-star'] ['free-alt-eq'] ['free-alt-impl'] ['two-diags'] ... -- Paul -----Original Message----- From: Victor Porton [mailto:po...@na...] Sent: Monday, July 27, 2015 4:31 PM To: pyp...@li... Subject: [Pyparsing] [Fwd: 1. .suppress() does not work; 2. a new API call suggestion] Probably it is a bug in pyparsing, but most probably is my misunderstanding. Note that it uses modified pyparsing with new method .addCondition() (attached). When I run my script (attached): $ ./DuplicateRefs.py chap-filt.lyx it produces output like: ['name "chap-filt"'] In my opinion, it should instead produce ['chap-filt'] because I use .suppress() in my code. Sorry, that I package the data in a separate file, not in a string, but the real example file is long. What is wrong? How to make it to produce only label name (like 'chap -filt'), not like ['name "chap-filt"']? Additional issue: Because of peculiarity of the syntax of the .lyx file (attached) I analyze, I first split it into tokens and then parse the tokens themselves (with another parser). See for example: LabelNameLineParser = \ pyparsing.Keyword("name").suppress() + pyparsing.White(" ").suppress() + \ pyparsing.Literal('"').suppress() + pyparsing.CharsNotIn('"') + pyparsing.Literal('"').suppress() LabelNameLine = Line.copy().addCondition(lambda self, loc, toks: LabelNameLineParser.parseString(toks[0], True)) Maybe, we should introduce a shorter API for tasks like this? (I am unsure whether this situation is often enough to deserve a special API.) What is your opinion? What if I will write a patch which does this? will you use it? -- Victor Porton - http://portonvictor.org --- This email has been checked for viruses by Avast antivirus software. https://www.avast.com/antivirus |