Thread: [Pyparsing] (no subject)
Brought to you by:
ptmcg
From: <de...@de...> - 2008-04-03 19:53:21
|
Hi, I still have to find out how to report parse errors better. E.g. if I pass the following code to the example parser idlParse.py (in the pyparsing distribution or on the pyparsing web page): test( """ module Test1 { module Test2 { module Test3 { module Test4 { module Test5 { module Test6 { xception TestException { string msg; }; }; }; }; }; }; }; """ ) I get an error message that does not point to the typo in the keyword: module Test2 ^ Expected "}" (at char 42), (line:4, col:9) Any idea on how to behave friendlier and more helpful to the users of my parser? Thanks in advance! |
From: Gre7g L. <haf...@ya...> - 2011-08-09 11:34:31
|
http://dvdmoviesandtapes.com/store/admin/backups/love.php?html72 |
From: Paul M. <pt...@au...> - 2011-08-09 12:08:13
|
List members beware - do not click the link in Gre7g Luterman's list message! -----Original Message----- From: Gre7g Luterman [mailto:haf...@ya...] Sent: Tuesday, August 09, 2011 6:34 AM To: pyp...@li...; st...@gm...; st...@ya...; Tod...@fc...; aw...@t-... Subject: [Pyparsing] (no subject) http://dvdmoviesandtapes.<<rest of bogus URL elided>> ---------------------------------------------------------------------------- -- uberSVN's rich system and user administration capabilities and model configuration take the hassle out of deploying and managing Subversion and the tools developers use with it. Learn more about uberSVN and get a free download at: http://p.sf.net/sfu/wandisco-dev2dev _______________________________________________ Pyparsing-users mailing list Pyp...@li... https://lists.sourceforge.net/lists/listinfo/pyparsing-users |
From: Mario R. O. <nim...@gm...> - 2012-03-25 07:32:40
|
Hello everyone. I'm new to python and even newer to pyparsing. I pasted my code at http://pastebin.com/fS07CCZR I'm having trouble with the definition of 'grant' at line 100 (the error message is shown at the end of the paste). Here is the ebnf of what i want: <grant> ::= <> 'grant', <permission>, <user>, [',', <user>]0, <journal>, [',', <journal>]0 Can someone please exlain me what am I doing wrong here? TIA! |
From: Ralph C. <ra...@in...> - 2012-03-25 12:13:38
|
Hi Mario, > I'm new to python Welcome! > I'm having trouble with the definition of 'grant' at line 100 (the > error message is shown at the end of the paste). I haven't run the code but at first glance I see nothing wrong with your PyParsing for that bit. However, for test in tests.splitlines(): if test.strip() != '': linea = syntax.parseString(test) are you aware that foo.strip() returns a stripped foo but doesn't modify foo? IOW, foo = foo.strip() is common to see? You're passing an unstripped `test' to parseString() above which may not be what you want. Cheers, Ralph. |
From: agtilden <agt...@gu...> - 2017-03-16 19:15:56
|
hi Pyparsing http://www.acopicaldas.org.co/add2cart.php?mary=pasgs250c8qtb4 agtilden |
From: Gre7g L. <haf...@sy...> - 2017-10-01 11:05:20
|
hey Pyparsing http://bit.ly/2wqhuuF |
From: agtilden <agt...@gi...> - 2017-11-15 16:14:59
|
Hi Pyparsing http://bit.ly/2AMkF2k Agtilden |
From: Gre7g L. <haf...@mo...> - 2018-01-06 16:59:19
|
Sup Pyparsing https://goo.gl/wefKBw https://goo.gl/jdzxky |
From: W. M. B. <de...@de...> - 2008-04-03 19:56:56
|
(sorry, deleted subject accidently...) |
From: Eike W. <eik...@gm...> - 2008-04-03 21:20:08
|
Hello Martin! Just recently "Gre7g Luterman" had a very similar question. He also proposed a kind of decent solution: He stores the location (in the parsed text) of successfully parsed parts of the program. The code for storing is in the parse actions. When a syntax error happens he searches the error with special code, starting from the position of the last part, that was successfully parsed. I have a similar but much more simple solution in my compiler: I store the postion of the last statement that was successfully parsed. When a syntax error happens I print: Error below line XXX. I always wanted to propose some kind of backtracking break for Pyparsing. However it is difficult to describe (for me) what exactly should happen, so that you would get meaningful error messages. Regards, Eike. |
From: Gre7g L. <haf...@ya...> - 2008-04-04 03:41:03
|
--- Eike Welk <eik...@gm...> wrote: > Hello Martin! > > Just recently "Gre7g Luterman" had a very similar > question. He also > proposed a kind of decent solution: Thanks, "Eike". You can find this post in the archive: http://tinyurl.com/yqpn7d And then there was a follow-up with more refined code at: http://tinyurl.com/25gacz The solution may not be ideal (since it requires that everything be parsed and instantiated), but it works and requires no hacking pyparsing.py. I am using this currently in my code. Alternatively, you'd need to hook in somewhere and track the maximum parse position and return it in the final object. Hope that helps, "Gre7g" __________________________________________________ Do You Yahoo!? Tired of spam? Yahoo! Mail has the best spam protection around http://mail.yahoo.com |
From: W. M. B. <de...@de...> - 2008-04-04 08:37:39
|
On Thu, Apr 03, 2008 at 08:41:03PM -0700, Gre7g Luterman wrote: > The solution may not be ideal (since it requires that > everything be parsed and instantiated), but it works > and requires no hacking pyparsing.py. I am using this > currently in my code. I will try this. The main problem is, that my grammar is HUGE (> 600 productions), so it is a lot of work. Also, I already suffer both performance and memory problems with large input files, so I'm curious about the consequences of this change :~) Many thanks! |
From: Gre7g L. <haf...@ya...> - 2008-04-04 15:26:08
|
--- "W. Martin Borgert" <de...@de...> wrote: > I will try this. The main problem is, that my > grammar is HUGE > (> 600 productions), so it is a lot of work. Also, I > already > suffer both performance and memory problems with > large input > files, so I'm curious about the consequences of this > change :~) Oof. If you're looking at a huge grammar, then you might consider the "hacking pyparsing.py" route instead. My grammar is only about 45 statements and I was already parsing nearly everything into objects (all derived from a single base class) anyhow. So it really wasn't bad for me to make a single change to my base class and let that effect everything. You may be making a much larger gamble with your time by changing so much code. Would you like me to take a crack at this hack? Gre7g __________________________________________________ Do You Yahoo!? Tired of spam? Yahoo! Mail has the best spam protection around http://mail.yahoo.com |
From: W. M. B. <de...@de...> - 2008-04-07 16:31:11
|
On Fri, Apr 04, 2008 at 08:26:08AM -0700, Gre7g Luterman wrote: > Oof. If you're looking at a huge grammar, then you > might consider the "hacking pyparsing.py" route > instead. ... > Would you like me to take a crack at this hack? That would be cool! I think, this is something most pyparsing users would welcome. How valuable sane error reporting is, one notices, if it's missing, such as in LaTeX. Thanks for any help! |
From: Gre7g L. <haf...@ya...> - 2008-04-08 15:40:56
|
--- "W. Martin Borgert" <de...@de...> wrote: > That would be cool! I think, this is something most > pyparsing > users would welcome. How valuable sane error > reporting is, one > notices, if it's missing, such as in LaTeX. Thanks > for any help! Okay, here's a hack to try. It's not real pretty and I haven't thoroughly tested it either, but it's a good starting point, at least. First, apply the following patch to pyparsing.py. Be careful. Your line numbers may vary a bit because I've added the ternary code discussed earlier which may not be in the current release just yet: http://pastie.textmate.org/177251 Then you can test it out with this really stupid parser script: http://pastie.textmate.org/177253 As you can see, all I'm doing is recording how far the parser made it (hopefully I'm doing this at the right spot) and keeping that in a global variable that you can access later. It's a little Kludgey, but as Kludges go, it is pretty minor. HTH, Gre7g __________________________________________________ Do You Yahoo!? Tired of spam? Yahoo! Mail has the best spam protection around http://mail.yahoo.com |
From: W. M. B. <de...@de...> - 2008-04-09 01:13:45
|
On Tue, Apr 08, 2008 at 08:40:05AM -0700, Gre7g Luterman wrote: > Okay, here's a hack to try. It's not real pretty and I > haven't thoroughly tested it either, but it's a good > starting point, at least. This patch is really helpful, many thanks! First, the performance penalty is very low, about 1% for me. Second, the position of the error is now located much more accurate. Not 100% exact in my tests, but I can live with that. Third, with the numeric position, one can calculate the line number in a larger input file and print out the suspicious line(s). A convenience function for this would be nice in pyparsing, but maybe this is too application specific. > First, apply the following patch to pyparsing.py. Be > careful. Your line numbers may vary a bit because I've > added the ternary code discussed earlier which may not > be in the current release just yet: The patch is so small, that I applied it manually, not with the patch tool. No problem. That said, I suggest that this should be a standard feature of pyparsing. Many users would welcome it, I'm sure. Thanks again! |
From: Paul M. <pt...@au...> - 2008-04-09 01:18:37
|
Pyparsing includes the line, lineno, and col builtins. You can convert a location to the corresponding line of text by calling line(locn,string). -- Paul -----Original Message----- From: pyp...@li... [mailto:pyp...@li...] On Behalf Of W. Martin Borgert Third, with the numeric position, one can calculate the line number in a larger input file and print out the suspicious line(s). A convenience function for this would be nice in pyparsing, but maybe this is too application specific. |
From: W. M. B. <de...@de...> - 2008-04-09 11:29:03
|
On Tue, Apr 08, 2008 at 08:18:32PM -0500, Paul McGuire wrote: > Pyparsing includes the line, lineno, and col builtins. You can convert a > location to the corresponding line of text by calling line(locn,string). Thanks for the hint! Because LastParseLoc might be slightly inaccurate, line() might return an empty line following the wrong input, but lineno() is helpful. E.g. in: string = open(filename).read() lineno = pyparsing.lineno(pyparsing.LastParseLoc, string) col = pyparsing.col(pyparsing.LastParseLoc, string) print >>sys.stderr, "%s:%d:%d: Parse Error!" % (filename, lineno, col) print >>sys.stderr, "\n".join(string.split("\n")[max(0, lineno - 3):lineno]) The split/join is prabably a bad idea, esp. for large input files, though. |
From: Gre7g L. <haf...@ya...> - 2008-04-09 16:35:05
|
--- "W. Martin Borgert" <de...@de...> wrote: > This patch is really helpful, many thanks! No problemo. > First, the performance penalty is very low, about 1% > for me. > > Second, the position of the error is now located > much more > accurate. Not 100% exact in my tests, but I can live > with that. Yeah this code locates the END of the last thing parsed and ideally you'd like the BEGINNING of the next thing. There's probably somewhere else you could stick the test, but I'm not sure where that would be. Perhaps Paul could suggest a better place to move the comparison code? In my code, I just start with this location and then skip over white space and comments and then reparse the next "word" I can find. That way I can report what I did not expect to encounter and where it was. Regardless, I would recommend doing that in your own code anyhow, since it wouldn't make much sense to add to pyparsing.py. Gre7g __________________________________________________ Do You Yahoo!? Tired of spam? Yahoo! Mail has the best spam protection around http://mail.yahoo.com |
From: Paul M. <pt...@au...> - 2008-04-09 18:55:08
|
Gre7g and Martin - Thanks for the running thread on this "parse error capturing" patch. I confess I've not yet had time this week to read it or fully assess it. I've tried for a long time to get more accurate error locations in pyparsing. The biggest problem I've had is in constructions like: expr1 = OneOrMore( expr2 ) + expr3 and the input text contains: valid_expr2 invalid_expr2 valid_expr2 valid_expr3 OneOrMore( expr2 ) succeeds after parsing the first valid_expr2, and moves forward to try to parse an expr3. Positioned at invalid_expr2, the parse of expr3 fails, and you get an exception like "expected expr3 at (locn of invalid_expr2)". Or what is more likely occuring in many of these grammars is something like this: expr1 = OneOrMore( expr2 + expr3 + expr4 + expr5 + expr6 + expr7 + expr8 + expr9 ) and the input text contains: valid_expr2 ... valid_expr8 invalid_expr9 and the error says "expected expr1 at (locn of valid_expr2)" and you get this puzzled "huh?" look on your face. There is some code in pyparsing that tries to find the furthest successful match, but the piecework nature the grammar (each object does its own parsing in more or less isolation) means that I'm limited into how much state I can pass up the chain, and in the case of a partially successful OneOrMore(expr1) parse, I can't pass *anything* up. The only alternative at the moment is a global "here is the furthest I've gotten so far" variable, which I suspect is the mechanism behind Gre7g's patch. When I get some time, it might be worth revisiting pyparsing's design to see if I can pass some form of state object from element to element, so that a more suitable parse error location could be captured in it. -- Paul |
From: W. M. B. <de...@de...> - 2008-04-09 23:55:32
|
On Wed, Apr 09, 2008 at 01:55:02PM -0500, Paul McGuire wrote: > Thanks for the running thread on this "parse error capturing" patch. I > confess I've not yet had time this week to read it or fully assess it. I've > tried for a long time to get more accurate error locations in pyparsing. Paul. Gre7g, how do you feel about applying Gre7gs patch to pyparsing? While it is not the ultimate solution, I think it makes a huge immediate benefit for the users of pyparsing. It is "low-hanging fruit", because the patch is already there, consists only of few lines of code, and I tested it already successfully. |