Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
1.2k views
in Technique[技术] by (71.8m points)

parsing - How can error reporting in grammars be improved?

Is there a way to get Perl 6 to generate an error message if a grammar does not match? Or at least return the position of the last data it processed? It is quite hard to fix syntax errors if all I get from the parser is 'no match'.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

If your focus is generating messages for users of your grammar, see Generating Good Parse Errors from a Parser and Grammar::ErrorReporting.

The rest of this answer is about development and debugging of grammars.


May 2020 update The obvious choice now is to use the Grammar Live View feature of the Comma IDE.


First, you can embed arbitrary closures (code) in Raku rules (or tokens or regexes). Just type { your code goes here } in the middle of a rule. So you could just sprinkle { say ... } statements where helpful for debugging. (Note that $/ and its relatives $0, $1 etc. and named sub-captures $<foo> etc. are automatically updated to refer to the current Match object and its sub-captures corresponding to the enclosing rule immediately prior to entering the closure. So you can introspect how the match is going at that point in the regex.)

But there are better options.

Are you using the "batteries included" Rakudo Star distribution? (You should be unless you've got good reason not to.) If so, you can add the line use Grammar::Tracer; (as described in the slides at http://www.jnthn.net/papers/2011-yapceu-grammars.pdf) to get a full trace of a parse.

My personal preference (edit: this answer was written years before Comma arrived on the scene; Comma also covers debugging of non-grammar code; and indeed a whole heck of a lot else besides) is to use the Rakudo debugger which provides everything Grammar::Tracer does plus a whole lot more besides (single stepping, breakpoints, etc. of all Raku code including regexes and grammars). The debugger is introduced in this video.

If you have any more questions, I recommend you visit the always friendly IRC channel #raku.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...