[#4766] Wiki — "Glen Stampoultzis" <trinexus@...>

21 messages 2000/09/04
[#4768] RE: Wiki — "NAKAMURA, Hiroshi" <nahi@...> 2000/09/04

Hi, Glen,

[#4783] Re: Wiki — Masatoshi SEKI <m_seki@...> 2000/09/04

[#4785] Re: Wiki — "NAKAMURA, Hiroshi" <nakahiro@...> 2000/09/05

Howdy,

[#4883] Re-binding a block — Dave Thomas <Dave@...>

16 messages 2000/09/12

[#4930] Perl 6 rumblings -- RFC 225 (v1) Data: Superpositions — Conrad Schneiker <schneik@...>

Hi,

11 messages 2000/09/15

[#4936] Ruby Book Eng. translation editor's questions — Jon Babcock <jon@...>

20 messages 2000/09/16

[#5045] Proposal: Add constants to Math — Robert Feldt <feldt@...>

15 messages 2000/09/21

[#5077] Crazy idea? infix method calls — hal9000@...

This is a generalization of the "in" operator idea which I

17 messages 2000/09/22

[#5157] Compile Problem with 1.6.1 — Scott Billings <aerogems@...>

When I try to compile Ruby 1.6.1, I get the following error:

15 messages 2000/09/27

[ruby-talk:5078] Regex.c error reporting beautifier

From: Aleksi Niemel<aleksi.niemela@...>
Date: 2000-09-22 22:36:03 UTC
List: ruby-talk #5078
A patch (as an attachment) for friendlier regexp compilation problem
reporting. To be precice, now Ruby tells better what's wrong with following
cases.

There's still some work to do. Two cases of invalid_pattern, that I didn't
understand how to generate. And I didn't check the other error messages - I
expect they're quite good already.

The patch shouldn't be applied directly. The reason is that for some
formatting with snprintf I needed a buffer, and I think it does not get
cleaned up as I didn't knew how to clean it up.

Anyway, all comments are welcome.

   - Aleksi


./ruby -e'p /++/.match("+++")[0]'
Previously:
  -e:1: invalid regular expression: /++/
Now:
  -e:1: invalid regular expression; there's no previous pattern, 
  to which '+' would define cardinality at 1: /++/


ruby -e'p /[/.match("foobar [")[0]'
Previously:
  -e:1: invalid regular expression: /[/
Now:
  -e:1: invalid regular expression; '[' can't be the last character: /[/


ruby -e'p /[]/.match("")[0]'
Previously:
  -e:1: invalid regular expression: /[]/
Now:
  -e:1: invalid regular expression; empty range: /[]/


/ruby -e'p /fo[[:/.match("fo[[:")[0]'
Previously:
  -e:1: invalid regular expression: /fo[[:/
Now:
  -e:1: invalid regular expression; re can't end '[[:': /fo[[:/


ruby -e'p /[[:alpha:]-a]/.match("")[0]'
Previously:
  -e:1: invalid regular expression: /[[:alpha:]-a]/
Now:
  -e:1: invalid regular expression; can't use character class as a start
value of range: /[[:alpha:]-a]/


ruby -e'p /[[:foo:]]/.match("foo")[0]'
Previously:
  -e:1: invalid regular expression: /[[:foo:]]/
Now:
  -e:1: invalid regular expression; foo is not a character class:
/[[:foo:]]/


ruby -e'p /[[:alnum:]/.match("")[0]'
Previously:
  -e:1: invalid regular expression: /[[:alnum:]/
Now:
-e:1: invalid regular expression; range doesn't have ending ']' after a
character class: /[[:alnum:]/


ruby -e'p /foo{/.match("foo")[0]'
Previously:
  -e:1: invalid regular expression: /foo{/
Now:
  -e:1: invalid regular expression; '{' can't be last character: /foo{/


ruby -e'p /{a/.match("oo")[0]'
Previously:
  -e:1: invalid regular expression: /{a/
Now:
  -e:1: invalid regular expression; there's no previous pattern, to which
'{' would define cardinality at 1: /{a/


ruby -e'str="\\"; p %r{#{str}}.match("")[0]'
Previously:
  -e:1: invalid regular expression: /\/ (RegexpError)
Now:
  -e:1: invalid regular expression; '\' can't be last character: /\/
(RegexpError)





Attachments (1)

regex.error_message.patch (4.08 KB, text/x-diff)
Index: regex.c
===================================================================
RCS file: /home/cvs/ruby/regex.c,v
retrieving revision 1.31
diff -u -r1.31 regex.c
--- regex.c	2000/09/22 05:37:52	1.31
+++ regex.c	2000/09/22 22:33:20
@@ -1190,6 +1190,8 @@
   register unsigned int c, c1;
   const char *p0;
   int numlen;
+#define ERROR_MSG_MAX_SIZE 200
+  char *error_msg;
 
   /* Address of the count-byte of the most recently inserted `exactn'
      command.  This makes it possible to tell whether a new exact-match
@@ -1262,6 +1264,11 @@
   int options = bufp->options;
   int old_options = 0;
 
+  error_msg = (char*)xmalloc(ERROR_MSG_MAX_SIZE+1);   /* this memory should be also 
+							 freeed to avoid leaks,
+							 dunno how and where */
+  if(!error_msg) goto memory_exhausted;
+
   bufp->fastmap_accurate = 0;
   bufp->must = 0;
   bufp->must_skip = 0;
@@ -1318,7 +1325,10 @@
     case '*':
       /* If there is no previous pattern, char not special. */
       if (!laststart) {
-	goto invalid_pattern;
+	snprintf(error_msg, ERROR_MSG_MAX_SIZE, 
+		 "invalid regular expression; there's no previous pattern, to which '%c' would define cardinality at %d", 
+		 c, p-pattern);
+	FREE_AND_RETURN(stackb, error_msg );
       }
       /* If there is a sequence of repetition chars,
 	 collapse it down to just one.  */
@@ -1400,7 +1410,7 @@
 
     case '[':
       if (p == pend)
-	goto invalid_pattern;
+	FREE_AND_RETURN(stackb, "invalid regular expression; '[' can't be the last character ie. can't start range at the end of pattern");
       while ((b - bufp->buffer + 9 + (1 << BYTEWIDTH) / BYTEWIDTH)
 	     > bufp->allocated)
 	EXTEND_BUFFER;
@@ -1441,7 +1451,7 @@
 	if (c == ']') {
 	  if (p == p0 + 1) {
 	    if (p == pend)
-	      goto invalid_pattern;
+	      FREE_AND_RETURN(stackb, "invalid regular expression; empty range");
 	  }
 	  else 
 	    /* Stop if this isn't merely a ] inside a bracket
@@ -1452,7 +1462,7 @@
 	/* Look ahead to see if it's a range when the last thing
 	   was a character class.  */
 	if (had_char_class && c == '-' && *p != ']')
-	  goto invalid_pattern;
+	  FREE_AND_RETURN(stackb, "invalid regular expression; can't use character class as a start value of range");
 	if (ismbchar(c)) {
 	  PATFETCH_MBC(c);
 	  had_mbchar++;
@@ -1582,7 +1592,7 @@
 
 	  /* If pattern is `[[:'.  */
 	  if (p == pend) 
-	    goto invalid_pattern;
+	    FREE_AND_RETURN(stackb, "invalid regular expression; re can't end '[[:'");
 
 	  for (;;) {
 	    PATFETCH (c);
@@ -1611,14 +1621,17 @@
 	    char is_upper = STREQ(str, "upper");
 	    char is_xdigit = STREQ(str, "xdigit");
 
-	    if (!IS_CHAR_CLASS(str))
-	      goto invalid_pattern;
+	    if (!IS_CHAR_CLASS(str)){
+	      snprintf(error_msg, ERROR_MSG_MAX_SIZE, 
+		       "invalid regular expression; %s is not a character class", str);
+	      FREE_AND_RETURN(stackb, error_msg );
+	    }
 
 	    /* Throw away the ] at the end of the character class.  */
 	    PATFETCH(c);
 
 	    if (p == pend) 
-	      goto invalid_pattern;
+	      FREE_AND_RETURN(stackb, "invalid regular expression; range doesn't have ending ']' after a character class");
 
 	    for (ch = 0; ch < 1 << BYTEWIDTH; ch++) {
 	      if (   (is_alnum  && ISALNUM(ch))
@@ -1938,9 +1951,14 @@
 
     case '{':
       /* If there is no previous pattern, this is an invalid pattern.  */
-      if (!laststart || p == pend) {
-	goto invalid_pattern;
+      if (!laststart) {
+	snprintf(error_msg, ERROR_MSG_MAX_SIZE, 
+		 "invalid regular expression; there's no previous pattern, to which '{' would define cardinality at %d", 
+		 p-pattern);
+	FREE_AND_RETURN(stackb, error_msg );
       }
+      if( p == pend)
+	FREE_AND_RETURN(stackb, "invalid regular expression; '{' can't be last character" );
 
       beg_interval = p - 1;
 
@@ -2119,7 +2137,8 @@
       goto normal_char;
 
     case '\\':
-      if (p == pend) goto invalid_pattern;
+      if (p == pend)
+	FREE_AND_RETURN(stackb, "invalid regular expression; '\\' can't be last character");
       /* Do not translate the character after the \, so that we can
 	 distinguish, e.g., \B from \b, even if we normally would
 	 translate, e.g., B to b.  */

In This Thread

Prev Next