diff --git a/src/cpp.c b/src/cpp.c
index fb837d6f6a7b70423e361da52478f0fcb09be85c..7c05078429c63a108d330e9258ff24dea07fc5a8 100644
--- a/src/cpp.c
+++ b/src/cpp.c
@@ -5,7 +5,7 @@
 \*/
 
 /*
- * $Id: cpp.c,v 1.79 2000/12/05 21:08:16 per Exp $
+ * $Id: cpp.c,v 1.80 2001/01/17 13:36:29 grubba Exp $
  */
 #include "global.h"
 #include "stralloc.h"
@@ -1144,9 +1144,61 @@ static void check_constant(struct cpp *this,
 	len--;
       }
 
-      for(dlen=0; dlen<len; dlen++)
-	if(!isidchar(INDEX_PCHARP(data, dlen)))
-	  break;
+      if (INDEX_PCHARP(data, 0) == '`') {
+	/* LFUN */
+	for(dlen=0; dlen<len; dlen++) {
+	  int c;
+	  if ((c = INDEX_PCHARP(data, dlen)) != '`') {
+	    switch(c) {
+	    case '/': case '%': case '*': case '&':
+	    case '|': case '^': case '~':
+	      dlen++;
+	      break;
+	    case '+':
+	      if ((++dlen < len) && INDEX_PCHARP(data, dlen) == '=')
+		dlen++;
+	      break;
+	    case '-':
+	      if ((++dlen < len) && INDEX_PCHARP(data, dlen) == '>') {
+		dlen++;
+	      }
+	      break;
+	    case '>': case '<': case '!': case '=':
+	      {
+		/* We get a false match for the operator `!!, but that's ok. */
+		int c2;
+		if ((++dlen < len) &&
+		    (((c2 = INDEX_PCHARP(data, dlen)) == c) || (c2 == '='))) {
+		  dlen++;
+		}
+	      }
+	      break;
+	    case '(':
+	      if ((++dlen < len) && INDEX_PHARP(data, dlen) == ')') {
+		dlen++;
+	      } else {
+		cpp_error(this, "Expected `().\n");
+	      }
+	      break;
+	    case '[':
+	      if ((++dlen < len) && INDEX_PHARP(data, ++dlen) == ']') {
+		dlen++;
+	      } else {
+		cpp_error(this, "Expected `[].\n");
+	      }
+	      break;
+	    default:
+	      cpp_error(this, "Unrecognized ` identifier.\n");
+	      break;
+	    }
+	    break;
+	  }
+	}
+      } else {
+  	for(dlen=0; dlen<len; dlen++)
+  	  if(!isidchar(INDEX_PCHARP(data, dlen)))
+  	    break;
+      }
 
       if(res)
       {