diff --git a/src/language.yacc b/src/language.yacc
index ffc29194d3b4214ef23aac6534b88bc8e4cc6435..0acfd26da91974b2d747c10dfe713f0aba9cad61 100644
--- a/src/language.yacc
+++ b/src/language.yacc
@@ -112,7 +112,7 @@
 %token TOK_WHILE "while"
 %token TOK_XOR_EQ "^="
 %token TOK_OPTIONAL "optional"
-%token TOK_SAFE_INDEX "?->"
+%token TOK_SAFE_INDEX "->?"
 %token TOK_SAFE_START_INDEX "[?"
 %token TOK_BITS "bits"
 %token TOK_AUTO_ID "auto"
@@ -4227,7 +4227,7 @@ expr5: literal_expr
   }
   | expr4 TOK_SAFE_INDEX line_number_info TOK_IDENTIFIER
   {
-    /* A?->B to ((tmp=A) && tmp->B) */
+    /* A->?B to ((tmp=A) && tmp->B) */
     int temporary;
     if( $1 && ($1->token == F_LOCAL) )
     {
diff --git a/src/lexer.h b/src/lexer.h
index 9b47ba85ee83c9059e9b59e0bd311657ba1def07..139a80850ae14f0af7c9cba2e160cdb94b22355e 100644
--- a/src/lexer.h
+++ b/src/lexer.h
@@ -1096,7 +1096,11 @@ unknown_directive:
 
     case '-':
       if(GOBBLE('=')) return TOK_SUB_EQ;
-      if(GOBBLE('>')) return TOK_ARROW;
+      if(GOBBLE('>'))
+	if(GOBBLE('?') ) /* ->? */
+	  return TOK_SAFE_INDEX;
+	else
+	  return TOK_ARROW;
       if(GOBBLE('-')) return TOK_DEC;
       return '-';
 
@@ -1171,24 +1175,14 @@ unknown_directive:
       if(GOBBLE(':'))
         return TOK_LOR;
 
-      if(GOBBLE('-') ) /* safe index: ?->  or ?[] */
+      if(GOBBLE('-') )
       {
-        if( GOBBLE( '>' ) ) /* ?-> */
-            return TOK_SAFE_INDEX;
+        if( GOBBLE( '>' ) ) { /* ?-> */
+	  return TOK_SAFE_INDEX;
+	}
         SKIPN(-1); /* Undo GOBBLE('-') above */
       }
 
-      /* Probably wanted:
-
-         ?.   for safe constant index
-         ?[]  for safe [] index
-
-         They however conflict with valid ?: syntaxes.
-      */
-
-      /* if( GOBBLE('.' ) ) */
-      /*   return TOK_SAFE_INDEX; */
-
       /* FALLTHRU */
 
     case ']':