From: Martin Duerst Date: 2007-10-24T15:58:14+09:00 Subject: Re: Improving 'syntax error, unexpected $end, expecting kEND'? At 04:15 07/10/24, David Flanagan wrote: >The patch below changes this message to: > >syntax error, unexpected "end-of-file", expecting "end" > >It doesn't tell you where the outermost open block begins, but at least the message isn't so cryptic. I don't know any way to get rid of the quotes around "end-of-file". This looks extremely helpful, in particular for (relative) beginners. Looking at the patch below, it seems to be easy to improve things for a few other cases, too. I just tried to fill in the blanks; maybe some of this stuff doesn't make sense, but I have included a patch below. As for personal experiences, when I get an error of this kind, I often add an "end" at some arbitrary place and see what happens. Then I move that "end" around a bit and see again what happens. That usually leads to a solution pretty quickly. Seems that sometimes randomized algorithms are useful even for programming :-). Regards, Martin. Index: parse.y =================================================================== --- parse.y (revision 13764) +++ parse.y (working copy) @@ -596,54 +596,55 @@ /*% %token %*/ - keyword_class - keyword_module - keyword_def - keyword_undef - keyword_begin - keyword_rescue - keyword_ensure - keyword_end - keyword_if - keyword_unless - keyword_then - keyword_elsif - keyword_else - keyword_case - keyword_when - keyword_while - keyword_until - keyword_for - keyword_break - keyword_next - keyword_redo - keyword_retry - keyword_in - keyword_do - keyword_do_cond - keyword_do_block + end_of_file 0 "end-of-file" + keyword_class "class" + keyword_module "module" + keyword_def "def" + keyword_undef "undef" + keyword_begin "begin" + keyword_rescue "rescue" + keyword_ensure "ensure" + keyword_end "end" + keyword_if "if" + keyword_unless "unless" + keyword_then "then" + keyword_elsif "elsif" + keyword_else "else" + keyword_case "case" + keyword_when "when" + keyword_while "while" + keyword_until "until" + keyword_for "for" + keyword_break "break" + keyword_next "next" + keyword_redo "redo" + keyword_retry "retry" + keyword_in "in" + keyword_do "do" + keyword_do_cond "do" + keyword_do_block "do" keyword_do_LAMBDA - keyword_return - keyword_yield - keyword_super - keyword_self - keyword_nil - keyword_true - keyword_false - keyword_and - keyword_or - keyword_not - modifier_if - modifier_unless - modifier_while - modifier_until - modifier_rescue - keyword_alias - keyword_defined - keyword_BEGIN - keyword_END - keyword__LINE__ - keyword__FILE__ + keyword_return "return" + keyword_yield "yield" + keyword_super "super" + keyword_self "self" + keyword_nil "nil" + keyword_true "true" + keyword_false "false" + keyword_and "and" + keyword_or "or" + keyword_not "not" + modifier_if "if" + modifier_unless "unless" + modifier_while "while" + modifier_until "until" + modifier_rescue "rescue" + keyword_alias "alias" + keyword_defined "defined" + keyword_BEGIN "BEGIN" + keyword_END "END" + keyword__LINE__ "__LINE__" + keyword__FILE__ "__FILE__" %token tIDENTIFIER tFID tGVAR tIVAR tCONSTANT tCVAR tLABEL %token tINTEGER tFLOAT tSTRING_CONTENT tCHAR #-#-# Martin J. Du"rst, Assoc. Professor, Aoyama Gakuin University #-#-# http://www.sw.it.aoyama.ac.jp mailto:duerst@it.aoyama.ac.jp