From: David Flanagan Date: 2007-10-27T03:23:16+09:00 Subject: Re: Improving 'syntax error, unexpected $end, expecting kEND'? This is a multi-part message in MIME format. --------------060001020909020705000508 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit David Flanagan wrote: > Another possibility is to hack yyerror to clean up the error messages > for us, possibly stripping the quotation marks (so that we could have > "\"rescue\" modifier" with only the keyword in quotes and removing any > hacky spaces or non-printing characters we stuck into the token strings > to fool bison. I haven't done any real C string manipulation complete > with memory allocation and freeing in 10 years, however, so I'm a little > reluctant to attempt this myself... Okay, despite my protests of not knowing how to do this, I figured it out. The yyerror function already uses ALLOCA_N once to allocate a string on the stack, so I don't feel bad about using it again. Now, before printing the error message it strips all double quotes out of it. So we can get error messages like "unexpected 'rescue' modifier" And I can get "end of file" in an error message without quotes. Furthermore, we can solve the issue of having to have unique strings for each token by just inserting additional escaped double-quotes characters where I was using spaces before. They'll be stripped out. Its kind of hacky, but it makes for nice error messages. Updated patch is attached. David --------------060001020909020705000508 Content-Type: text/plain; name="patch" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="patch" SW5kZXg6IHBhcnNlLnkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gcGFyc2UueQkocmV2aXNpb24gMTM3 ODIpCisrKyBwYXJzZS55CSh3b3JraW5nIGNvcHkpCkBAIC01OTIsNjQgKzU5Miw4NyBAQAog fQogCiAvKiUlJSovCisvKiAKKyAqIFRva2VuIG5hbWVzIGluIGRvdWJsZSBxdW90ZXMgYXJl IGp1c3QgZm9yIHVzZSBpbiBlcnJvciBtZXNzYWdlcy4gCisgKiBUaGUgZXNjYXBlZCBkb3Vi bGUtcXVvdGVzIHdpdGhpbiB0aGUgbmFtZXMgYXJlIHN0cmlwcGVkIG91dCBpbiB5eWVycm9y LgorICogVGhleSBhcmUgcmVxdWlyZWQgc28gdGhhdCB0d28gZGlzdGluY3QgdG9rZW5zIGRv bid0IGhhdmUgdGhlIHNhbWUgbmFtZQorICovCiAldG9rZW4KIC8qJQogJXRva2VuIDx2YWw+ CiAlKi8KLQlrZXl3b3JkX2NsYXNzCi0Ja2V5d29yZF9tb2R1bGUKLQlrZXl3b3JkX2RlZgot CWtleXdvcmRfdW5kZWYKLQlrZXl3b3JkX2JlZ2luCi0Ja2V5d29yZF9yZXNjdWUKLQlrZXl3 b3JkX2Vuc3VyZQotCWtleXdvcmRfZW5kCi0Ja2V5d29yZF9pZgotCWtleXdvcmRfdW5sZXNz Ci0Ja2V5d29yZF90aGVuCi0Ja2V5d29yZF9lbHNpZgotCWtleXdvcmRfZWxzZQotCWtleXdv cmRfY2FzZQotCWtleXdvcmRfd2hlbgotCWtleXdvcmRfd2hpbGUKLQlrZXl3b3JkX3VudGls Ci0Ja2V5d29yZF9mb3IKLQlrZXl3b3JkX2JyZWFrCi0Ja2V5d29yZF9uZXh0Ci0Ja2V5d29y ZF9yZWRvCi0Ja2V5d29yZF9yZXRyeQotCWtleXdvcmRfaW4KLQlrZXl3b3JkX2RvCi0Ja2V5 d29yZF9kb19jb25kCi0Ja2V5d29yZF9kb19ibG9jawotCWtleXdvcmRfZG9fTEFNQkRBCi0J a2V5d29yZF9yZXR1cm4KLQlrZXl3b3JkX3lpZWxkCi0Ja2V5d29yZF9zdXBlcgotCWtleXdv cmRfc2VsZgotCWtleXdvcmRfbmlsCi0Ja2V5d29yZF90cnVlCi0Ja2V5d29yZF9mYWxzZQot CWtleXdvcmRfYW5kCi0Ja2V5d29yZF9vcgotCWtleXdvcmRfbm90Ci0JbW9kaWZpZXJfaWYK LQltb2RpZmllcl91bmxlc3MKLQltb2RpZmllcl93aGlsZQotCW1vZGlmaWVyX3VudGlsCi0J bW9kaWZpZXJfcmVzY3VlCi0Ja2V5d29yZF9hbGlhcwotCWtleXdvcmRfZGVmaW5lZAotCWtl eXdvcmRfQkVHSU4KLQlrZXl3b3JkX0VORAotCWtleXdvcmRfX0xJTkVfXwotCWtleXdvcmRf X0ZJTEVfXwogCi0ldG9rZW4gPGlkPiAgIHRJREVOVElGSUVSIHRGSUQgdEdWQVIgdElWQVIg dENPTlNUQU5UIHRDVkFSIHRMQUJFTAotJXRva2VuIDxub2RlPiB0SU5URUdFUiB0RkxPQVQg dFNUUklOR19DT05URU5UIHRDSEFSCi0ldG9rZW4gPG5vZGU+IHROVEhfUkVGIHRCQUNLX1JF RgotJXRva2VuIDxudW0+ICB0UkVHRVhQX0VORAorICAgICAgICBlbmRfb2ZfZmlsZSAwICAg ICAiZW5kIG9mIGZpbGUiCisJa2V5d29yZF9jbGFzcyAgICAgIidjbGFzcyciCisJa2V5d29y ZF9tb2R1bGUgICAgIidtb2R1bGUnIgorCWtleXdvcmRfZGVmICAgICAgICInZGVmJyIKKwlr ZXl3b3JkX3VuZGVmICAgICAiJ3VuZGVmJyIKKwlrZXl3b3JkX2JlZ2luICAgICAiJ2JlZ2lu JyIKKwlrZXl3b3JkX3Jlc2N1ZSAgICAiJ3Jlc2N1ZSciCisJa2V5d29yZF9lbnN1cmUgICAg IidlbnN1cmUnIgorCWtleXdvcmRfZW5kICAgICAgICInZW5kJyIKKwlrZXl3b3JkX2lmICAg ICAgICAiJ2lmJyIKKwlrZXl3b3JkX3VubGVzcyAgICAiJ3VubGVzcyciCisJa2V5d29yZF90 aGVuICAgICAgIid0aGVuJyIKKwlrZXl3b3JkX2Vsc2lmICAgICAiJ2Vsc2lmJyIKKwlrZXl3 b3JkX2Vsc2UgICAgICAiJ2Vsc2UnIgorCWtleXdvcmRfY2FzZSAgICAgICInY2FzZSciCisJ a2V5d29yZF93aGVuICAgICAgIid3aGVuJyIKKwlrZXl3b3JkX3doaWxlICAgICAiJ3doaWxl JyIKKwlrZXl3b3JkX3VudGlsICAgICAiJ3VudGlsJyIKKwlrZXl3b3JkX2ZvciAgICAgICAi J2ZvciciCisJa2V5d29yZF9icmVhayAgICAgIidicmVhayciCisJa2V5d29yZF9uZXh0ICAg ICAgIiduZXh0JyIKKwlrZXl3b3JkX3JlZG8gICAgICAiJ3JlZG8nIgorCWtleXdvcmRfcmV0 cnkgICAgICIncmV0cnknIgorCWtleXdvcmRfaW4gICAgICAgICInaW4nIgorCWtleXdvcmRf ZG8gICAgICAgICInZG8nIgorCWtleXdvcmRfZG9fY29uZCAgICInZG8nXCIiCisJa2V5d29y ZF9kb19ibG9jayAgIidkbydcIlwiIgorCWtleXdvcmRfZG9fTEFNQkRBICInZG8nXCJcIlwi IgorCWtleXdvcmRfcmV0dXJuICAgICIncmV0dXJuJyIKKwlrZXl3b3JkX3lpZWxkICAgICAi J3lpZWxkJyIKKwlrZXl3b3JkX3N1cGVyICAgICAiJ3N1cGVyJyIKKwlrZXl3b3JkX3NlbGYg ICAgICAiJ3NlbGYnIgorCWtleXdvcmRfbmlsICAgICAgICInbmlsJyIKKwlrZXl3b3JkX3Ry dWUgICAgICAiJ3RydWUnIgorCWtleXdvcmRfZmFsc2UgICAgICInZmFsc2UnIgorCWtleXdv cmRfYW5kICAgICAgICInYW5kJyIKKwlrZXl3b3JkX29yICAgICAgICAiJ29yJyIKKwlrZXl3 b3JkX25vdCAgICAgICAiJ25vdCciCisJbW9kaWZpZXJfaWYgICAgICAgIidpZicgbW9kaWZl ciIKKwltb2RpZmllcl91bmxlc3MgICAiJ3VubGVzcycgbW9kaWZpZXIiCisJbW9kaWZpZXJf d2hpbGUgICAgIid3aGlsZScgbW9kaWZlciIKKyAgICAgICAgbW9kaWZpZXJfdW50aWwgICAg Iid1bnRpbCcgbW9kaWZlciIKKwltb2RpZmllcl9yZXNjdWUgICAiJ3Jlc2N1ZScgbW9kaWZp ZXIiCisJa2V5d29yZF9hbGlhcyAgICAgIidhbGlhcyciCisJa2V5d29yZF9kZWZpbmVkICAg IidkZWZpbmVkPyciCisJa2V5d29yZF9CRUdJTiAgICAgIidCRUdJTiciCisJa2V5d29yZF9F TkQgICAgICAgIidFTkQnIgorCWtleXdvcmRfX0xJTkVfXyAgICInX19MSU5FX18nIgorCWtl eXdvcmRfX0ZJTEVfXyAgICInX19GSUxFX18nIgogCisldG9rZW4gPGlkPgorICB0SURFTlRJ RklFUiAgICAgICAgICAgICAiaWRlbnRpZmllciIKKyAgdEZJRAorICB0R1ZBUiAgICAgICAg ICAgICAgICAgICAiZ2xvYmFsIHZhcmlhYmxlIgorICB0SVZBUiAgICAgICAgICAgICAgICAg ICAiaW5zdGFuY2UgdmFyaWFibGUiCisgIHRDT05TVEFOVCAgICAgICAgICAgICAgICJjb25z dGFudCIKKyAgdENWQVIgICAgICAgICAgICAgICAgICAgImNsYXNzIHZhcmlhYmxlIgorICB0 TEFCRUwgICAgICAgICAgICAgICAgICAibGFiZWwiCisKKyV0b2tlbiA8bm9kZT4KKyAgdElO VEVHRVIgICAgICAgICAgICAgICAgImludGVnZXIiCisgIHRGTE9BVCAgICAgICAgICAgICAg ICAgICJmbG9hdCIKKyAgdFNUUklOR19DT05URU5UICAgICAgICAgInN0cmluZyBjb250ZW50 IgorICB0Q0hBUiAgICAgICAgICAgICAgICAgICAiY2hhcmFjdGVyIGxpdGVyYWwiCisgIHRO VEhfUkVGICAgICAgICAgICAgICAgICIkbiIKKyAgdEJBQ0tfUkVGICAgICAgICAgICAgICAg IiQmLCAmYCwgJlxcLCBvciAkKyIKKworJXRva2VuIDxudW0+CisgIHRSRUdFWFBfRU5EICAg ICAgICAgICAgICJyZWdleHAgZW5kIgorCisKICV0eXBlIDxub2RlPiBzaW5nbGV0b24gc3Ry aW5ncyBzdHJpbmcgc3RyaW5nMSB4c3RyaW5nIHJlZ2V4cAogJXR5cGUgPG5vZGU+IHN0cmlu Z19jb250ZW50cyB4c3RyaW5nX2NvbnRlbnRzIHN0cmluZ19jb250ZW50CiAldHlwZSA8bm9k ZT4gd29yZHMgcXdvcmRzIHdvcmRfbGlzdCBxd29yZF9saXN0IHdvcmQKQEAgLTY3NCwzNiAr Njk3LDUyIEBACiAvKiUKICV0eXBlIDx2YWw+IHByb2dyYW0gcmVzd29yZHMgdGhlbiBkbyBk b3Rfb3JfY29sb24KICUqLwotJXRva2VuIHRVUExVUwkJLyogdW5hcnkrICovCi0ldG9rZW4g dFVNSU5VUwkJLyogdW5hcnktICovCi0ldG9rZW4gdFBPVwkJLyogKiogKi8KLSV0b2tlbiB0 Q01QCQkvKiA8PT4gKi8KLSV0b2tlbiB0RVEJCS8qID09ICovCi0ldG9rZW4gdEVRUQkJLyog PT09ICovCi0ldG9rZW4gdE5FUQkJLyogIT0gKi8KLSV0b2tlbiB0R0VRCQkvKiA+PSAqLwot JXRva2VuIHRMRVEJCS8qIDw9ICovCi0ldG9rZW4gdEFORE9QIHRPUk9QCS8qICYmIGFuZCB8 fCAqLwotJXRva2VuIHRNQVRDSCB0Tk1BVENICS8qID1+IGFuZCAhfiAqLwotJXRva2VuIHRE T1QyIHRET1QzCS8qIC4uIGFuZCAuLi4gKi8KLSV0b2tlbiB0QVJFRiB0QVNFVAkvKiBbXSBh bmQgW109ICovCi0ldG9rZW4gdExTSEZUIHRSU0hGVAkvKiA8PCBhbmQgPj4gKi8KLSV0b2tl biB0Q09MT04yCQkvKiA6OiAqLwotJXRva2VuIHRDT0xPTjMJCS8qIDo6IGF0IEVYUFJfQkVH ICovCi0ldG9rZW4gPGlkPiB0T1BfQVNHTgkvKiArPSwgLT0gIGV0Yy4gKi8KLSV0b2tlbiB0 QVNTT0MJCS8qID0+ICovCi0ldG9rZW4gdExQQVJFTgkJLyogKCAqLwotJXRva2VuIHRMUEFS RU5fQVJHCS8qICggKi8KLSV0b2tlbiB0UlBBUkVOCQkvKiApICovCi0ldG9rZW4gdExCUkFD SwkJLyogWyAqLwotJXRva2VuIHRMQlJBQ0UJCS8qIHsgKi8KLSV0b2tlbiB0TEJSQUNFX0FS RwkvKiB7ICovCi0ldG9rZW4gdFNUQVIJCS8qICogKi8KLSV0b2tlbiB0QU1QRVIJCS8qICYg Ki8KLSV0b2tlbiB0TEFNQkRBCQkvKiAtPiAqLwotJXRva2VuIHRTWU1CRUcgdFNUUklOR19C RUcgdFhTVFJJTkdfQkVHIHRSRUdFWFBfQkVHIHRXT1JEU19CRUcgdFFXT1JEU19CRUcKLSV0 b2tlbiB0U1RSSU5HX0RCRUcgdFNUUklOR19EVkFSIHRTVFJJTkdfRU5EIHRMQU1CRUcKKyV0 b2tlbiB0VVBMVVMJCSInKyciICAgIC8qIHVuYXJ5KyAqLworJXRva2VuIHRVTUlOVVMJCSIn LSciICAgIC8qIHVuYXJ5LSAqLyAgCisldG9rZW4gdFBPVwkJIicqKiciIAorJXRva2VuIHRD TVAJCSInPD0+JyIKKyV0b2tlbiB0RVEJCSInPT0nIiAKKyV0b2tlbiB0RVFRCQkiJz09PSci CisldG9rZW4gdE5FUQkJIichPSciCisldG9rZW4gdEdFUQkJIic+PSciCisldG9rZW4gdExF UQkJIic8PSciCisldG9rZW4gdEFORE9QICAgICAgICAgICAiJyYmJyIKKyV0b2tlbiB0T1JP UCAgICAgICAgICAgICInfHwnIgorJXRva2VuIHRNQVRDSCAgICAgICAgICAgIic9ficiCisl dG9rZW4gdE5NQVRDSCAgICAgICAgICAiJyF+JyIKKyV0b2tlbiB0RE9UMiAgICAgICAgICAg ICInLi4nIgorJXRva2VuIHRET1QzICAgIAkiJy4uLiciCisldG9rZW4gdEFSRUYgICAgICAg ICAgICAiJ1tdJyIKKyV0b2tlbiB0QVNFVAkgICAgICAgICInW109JyIgCisldG9rZW4gdExT SEZUICAgICAgICAgICAiJzw8JyIKKyV0b2tlbiB0UlNIRlQgICAgICAgICAgICInPj4nIgor JXRva2VuIHRDT0xPTjIJCSInOjonIgorJXRva2VuIHRDT0xPTjMJCSInOjonXCIiICAgICAg ICAgICAgICAgICAgLyogYXQgRVhQUl9CRUcgKi8KKyV0b2tlbiA8aWQ+IHRPUF9BU0dOCSJh YmJyZXZpYXRlZCBhc3NpZ25tZW50IiAgLyogKz0sIC09ICBldGMuICovCisldG9rZW4gdEFT U09DCQkiJz0+JyIKKyV0b2tlbiB0TFBBUkVOCQkiJygnIgorJXRva2VuIHRMUEFSRU5fQVJH CSInKCdcIiIKKyV0b2tlbiB0UlBBUkVOCQkiJyknIgorJXRva2VuIHRMQlJBQ0sJCSInWyci CisldG9rZW4gdExCUkFDRQkJIid7JyIKKyV0b2tlbiB0TEJSQUNFX0FSRwkiJ3snXCIiCisl dG9rZW4gdFNUQVIJCSInKiciCisldG9rZW4gdEFNUEVSCQkiJyYnIgorJXRva2VuIHRMQU1C REEJCSInLT4nIgogCisldG9rZW4KKyAgdFNZTUJFRyAgICAgICAgICAgICAgICJiZWdpbm5p bmcgb2Ygc3ltYm9sIgorICB0U1RSSU5HX0JFRyAgICAgICAgICAgImJlZ2lubmluZyBvZiBz dHJpbmciCisgIHRYU1RSSU5HX0JFRyAgICAgICAgICAiYmVnaW5uaW5nIG9mIGV4ZWN1dGlv biBzdHJpbmciCisgIHRSRUdFWFBfQkVHICAgICAgICAgICAiYmVnaW5uaW5nIG9mIHJlZ2V4 cCIKKyAgdFdPUkRTX0JFRyAgICAgICAgICAgICInJXcnIgorICB0UVdPUkRTX0JFRyAgICAg ICAgICAgIiclVyciCisgIHRTVFJJTkdfREJFRyAgICAgICAgICAic3RyaW5nIGludGVycG9s YXRpb24iCisgIHRTVFJJTkdfRFZBUiAgICAgICAgICAic3RyaW5nIGludGVycG9sYXRpb25c IiIKKyAgdFNUUklOR19FTkQgICAgICAgICAgICJlbmQgb2Ygc3RyaW5nIgorICB0TEFNQkVH ICAgICAgICAgICAgICAgImJlZ2lubmluZyBvZiBsYW1iZGEiCisgCisKIC8qCiAgKglwcmVj ZWRlbmNlIHRhYmxlCiAgKi8KQEAgLTQ1ODYsNyArNDYyNSwyMSBAQAogICAgIGNvbnN0IGNo YXIgKnAsICpwZTsKICAgICBjaGFyICpidWY7CiAgICAgaW50IGxlbiwgaTsKKyAgICBjaGFy ICpjOwogCisgICAgLyoKKyAgICAgKiBTdHJpcCBkb3VibGUgcXVvdGVzIGZyb20gdGhlIGVy cm9yIG1lc3NhZ2UKKyAgICAgKiBUaGlzIGlzIGEgaGFjayB0byBjbGVhbiB1cCBlcnJvciBt ZXNzYWdlcyBnZW5lcmF0ZWQgYnkgYmlzb24KKyAgICAgKiBTZWUgdGhlIHRva2VuIHN0cmlu Z3MgZGVjbGFyZWQgd2l0aCAldG9rZW4KKyAgICAgKi8KKyAgICBsZW4gPSBzdHJsZW4obXNn KTsKKyAgICBidWYgPSBBTExPQ0FfTihjaGFyLCBsZW4pOworICAgIGZvcihpID0gMCwgYyA9 IGJ1ZjsgaSA8IGxlbjsgaSsrKSB7CisJaWYgKG1zZ1tpXSAhPSAnIicpICpjKysgPSBtc2db aV07CisgICAgfQorICAgICpjID0gJ1wwJzsgIC8qIE5VTC10ZXJtaW5hdGUgKi8KKyAgICBt c2cgPSBidWY7CisKICAgICBjb21waWxlX2Vycm9yKFBBUlNFUl9BUkcgIiVzIiwgbXNnKTsK ICAgICBwID0gbGV4X3A7CiAgICAgd2hpbGUgKGxleF9wYmVnIDw9IHApIHsK --------------060001020909020705000508--