From: Robin Stocker Date: 2006-04-02T02:11:26+09:00 Subject: [PATCH] parse.y: literal strings for tokens --------------040201060901050003090402 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Hi, The attached patch adds literal strings for tokens in parse.y so that parse error messages are more user-friendly. See [ruby-talk:179793] and [ruby-talk:187099] for descriptions of the problem. For example, instead of: -e:1: syntax error, unexpected tIDENTIFIER, expecting $end the output is: -e:1: syntax error, unexpected identifier, expecting $end or: -e:1: syntax error, unexpected kEND -e:1: syntax error, unexpected end I created and tested the patch with the latest Ruby CVS. I hope the formatting and indenting is ok and that I translated all tokens right. Regards, Robin Stocker --------------040201060901050003090402 Content-Type: text/plain; x-mac-type="0"; x-mac-creator="0"; name="parse.y.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="parse.y.patch" Index: parse.y =================================================================== RCS file: /src/ruby/parse.y,v retrieving revision 1.434 diff -u -r1.434 parse.y --- parse.y 26 Mar 2006 13:04:13 -0000 1.434 +++ parse.y 1 Apr 2006 16:50:21 -0000 @@ -475,59 +475,73 @@ /*% %token %*/ - kCLASS - kMODULE - kDEF - kUNDEF - kBEGIN - kRESCUE - kENSURE - kEND - kIF - kUNLESS - kTHEN - kELSIF - kELSE - kCASE - kWHEN - kWHILE - kUNTIL - kFOR - kBREAK - kNEXT - kREDO - kRETRY - kIN - kDO - kDO_COND - kDO_BLOCK - kDO_LAMBDA - kRETURN - kYIELD - kSUPER - kSELF - kNIL - kTRUE - kFALSE - kAND - kOR - kNOT - kIF_MOD - kUNLESS_MOD - kWHILE_MOD - kUNTIL_MOD - kRESCUE_MOD - kALIAS - kDEFINED - klBEGIN - klEND - k__LINE__ - k__FILE__ + kCLASS "class" + kMODULE "module" + kDEF "def" + kUNDEF "undef" + kBEGIN "begin" + kRESCUE "rescue" + kENSURE "ensure" + kEND "end" + kIF "if" + kUNLESS "unless" + kTHEN "then" + kELSIF "elsif" + kELSE "else" + kCASE "case" + kWHEN "when" + kWHILE "while" + kUNTIL "until" + kFOR "for" + kBREAK "break" + kNEXT "next" + kREDO "redo" + kRETRY "retry" + kIN "in" + kDO "do" + kDO_COND "do condition" + kDO_BLOCK "do block" + kDO_LAMBDA "do lambda" + kRETURN "return" + kYIELD "yield" + kSUPER "super" + kSELF "self" + kNIL "nil" + kTRUE "true" + kFALSE "false" + kAND "and" + kOR "or" + kNOT "not" + kIF_MOD "if modifier" + kUNLESS_MOD "unless modifier" + kWHILE_MOD "while modifier" + kUNTIL_MOD "until modifier" + kRESCUE_MOD "rescue modifier" + kALIAS "alias" + kDEFINED "defined" + klBEGIN "BEGIN" + klEND "END" + k__LINE__ "__LINE__" + k__FILE__ "__FILE__" + +%token + tIDENTIFIER "identifier" + tFID + tGVAR "global variable" + tIVAR "instance variable" + tCONSTANT "constant" + tCVAR "class variable" + tLABEL "label" + +%token + tINTEGER "integer" + tFLOAT "float" + tSTRING_CONTENT "string content" -%token tIDENTIFIER tFID tGVAR tIVAR tCONSTANT tCVAR tLABEL -%token tINTEGER tFLOAT tSTRING_CONTENT %token tNTH_REF tBACK_REF -%token tREGEXP_END + +%token + tREGEXP_END "regexp end" %type singleton strings string string1 xstring regexp %type string_contents xstring_contents string_content @@ -552,36 +566,51 @@ /*% %type program reswords then do dot_or_colon %*/ -%token tUPLUS /* unary+ */ -%token tUMINUS /* unary- */ -%token tPOW /* ** */ -%token tCMP /* <=> */ -%token tEQ /* == */ -%token tEQQ /* === */ -%token tNEQ /* != */ -%token tGEQ /* >= */ -%token tLEQ /* <= */ -%token tANDOP tOROP /* && and || */ -%token tMATCH tNMATCH /* =~ and !~ */ -%token tDOT2 tDOT3 /* .. and ... */ -%token tAREF tASET /* [] and []= */ -%token tLSHFT tRSHFT /* << and >> */ -%token tCOLON2 /* :: */ -%token tCOLON3 /* :: at EXPR_BEG */ -%token tOP_ASGN /* +=, -= etc. */ -%token tASSOC /* => */ -%token tLPAREN /* ( */ -%token tLPAREN_ARG /* ( */ -%token tRPAREN /* ) */ -%token tLBRACK /* [ */ -%token tLBRACE /* { */ -%token tLBRACE_ARG /* { */ -%token tSTAR /* * */ -%token tAMPER /* & */ -%token tLAMBDA /* -> */ -%token tLAMBDA_ARG /* -> */ -%token tSYMBEG tSTRING_BEG tXSTRING_BEG tREGEXP_BEG tWORDS_BEG tQWORDS_BEG -%token tSTRING_DBEG tSTRING_DVAR tSTRING_END tLAMBEG + +%token + tUPLUS "unary +" + tUMINUS "unary -" + tPOW "**" + tCMP "<=>" + tEQ "==" + tEQQ "===" + tNEQ "!=" + tGEQ ">=" + tLEQ "<=" + tANDOP "&&" + tOROP "||" + tMATCH "=~" + tNMATCH "!~" + tDOT2 ".." + tDOT3 "..." + tAREF "[]" + tASET "[]=" + tLSHFT "<<" + tRSHFT ">>" + tCOLON2 "::" + tCOLON3 "::" /* at EXPR_BEG */ + tOP_ASGN "assignment operator" /* +=, -= etc. */ + tASSOC "=>" + tLPAREN "(" + tLPAREN_ARG "(" + tRPAREN ")" + tLBRACK "[" + tLBRACE "{" + tLBRACE_ARG "{" + tSTAR "*" + tAMPER "&" + tLAMBDA "->" + tLAMBDA_ARG "->" + tSYMBEG "beginning of symbol" + tSTRING_BEG "beginning of string" + tXSTRING_BEG "beginning of execution string" + tREGEXP_BEG "beginning of regexp" + tWORDS_BEG "%w" + tQWORDS_BEG "%W" + tSTRING_DBEG "string interpolation" + tSTRING_DVAR "string interpolation" + tSTRING_END "end of string" + tLAMBEG "beginning of lambda" /* * precedence table --------------040201060901050003090402--