From 052fd7162f95f55f9bef81ca062432dcbe68c0a6 Mon Sep 17 00:00:00 2001
From: Emanuel Gestosa <emanuel-367@hotmail.com>
Date: Wed, 16 Aug 2023 16:11:36 +0100
Subject: [PATCH] parsing positive lookahead

---
 vim-engine/src/main/antlr/RegexLexer.g4  | 23 ++++++++++++++++++-----
 vim-engine/src/main/antlr/RegexParser.g4 | 11 ++++++-----
 2 files changed, 24 insertions(+), 10 deletions(-)

diff --git a/vim-engine/src/main/antlr/RegexLexer.g4 b/vim-engine/src/main/antlr/RegexLexer.g4
index 5d80a2dc8..4f6b531c9 100644
--- a/vim-engine/src/main/antlr/RegexLexer.g4
+++ b/vim-engine/src/main/antlr/RegexLexer.g4
@@ -15,7 +15,8 @@ tokens {
   CLASS_NOT_HEX_NL, CLASS_OCTAL_NL, CLASS_NOT_OCTAL_NL, CLASS_WORD_NL, CLASS_NOT_WORD_NL,
   CLASS_HEADWORD_NL, CLASS_NOT_HEADWORD_NL, CLASS_ALPHA_NL, CLASS_NOT_ALPHA_NL, CLASS_LCASE_NL,
   CLASS_NOT_LCASE_NL, CLASS_UCASE_NL, CLASS_NOT_UCASE_NL, START_OF_FILE, END_OF_FILE,
-  CARET, DOLLAR, START_OF_LINE, END_OF_LINE, ATOMIC, START_OF_WORD, END_OF_WORD
+  CARET, DOLLAR, START_OF_LINE, END_OF_LINE, ATOMIC, START_OF_WORD, END_OF_WORD,
+  POSITIVE_LOOKAHEAD
 }
 
 @members {
@@ -39,11 +40,14 @@ LEFT_PAREN_NOCAPTURE_MAGIC: '\\%(' -> type(LEFT_PAREN_NOCAPTURE);
 RIGHT_PAREN_MAGIC: '\\)' -> type(RIGHT_PAREN);
 DOT_MAGIC: '.' -> type(DOT);
 DOTNL_MAGIC: '\\_.' -> type(DOTNL);
+BACKREFERENCE_MAGIC: '\\' [0-9] -> type(BACKREFERENCE);
+
+// multi
 STAR_MAGIC: '*' -> type(STAR);
 PLUS_MAGIC: '\\+' -> type(PLUS);
 OPTIONAL_MAGIC: ('\\=' | '\\?') -> type(OPTIONAL);
 ATOMIC_MAGIC: '\\@>' -> type(ATOMIC);
-BACKREFERENCE_MAGIC: '\\' [0-9] -> type(BACKREFERENCE);
+POSITIVE_LOOKAHEAD_MAGIC: '\\@=' -> type(POSITIVE_LOOKAHEAD);
 
 RANGE_START_MAGIC: '\\{' -> pushMode(INSIDE_RANGE), type(RANGE_START);
 RANGE_START_LAZY_MAGIC: '\\{-' -> pushMode(INSIDE_RANGE), type(RANGE_START_LAZY);
@@ -152,11 +156,14 @@ LEFT_PAREN_NOCAPTURE_NOMAGIC: '\\%(' -> type(LEFT_PAREN_NOCAPTURE);
 RIGHT_PAREN_NOMAGIC: '\\)' -> type(RIGHT_PAREN);
 DOT_NOMAGIC: '\\.' -> type(DOT);
 DOTNL_NOMAGIC: '\\_.' -> type(DOTNL);
+BACKREFERENCE_NOMAGIC: '\\' [0-9] -> type(BACKREFERENCE);
+
+// multi
 STAR_NOMAGIC: '\\*' -> type(STAR);
 PLUS_NOMAGIC: '\\+' -> type(PLUS);
 OPTIONAL_NOMAGIC: ('\\=' | '\\?') -> type(OPTIONAL);
 ATOMIC_NOMAGIC: '\\@>' -> type(ATOMIC);
-BACKREFERENCE_NOMAGIC: '\\' [0-9] -> type(BACKREFERENCE);
+POSITIVE_LOOKAHEAD_NOMAGIC: '\\@=' -> type(POSITIVE_LOOKAHEAD);
 
 RANGE_START_NOMAGIC: '\\{' -> pushMode(INSIDE_RANGE), type(RANGE_START);
 RANGE_START_LAZY_NOMAGIC: '\\{-' -> pushMode(INSIDE_RANGE), type(RANGE_START_LAZY);
@@ -266,11 +273,14 @@ LEFT_PAREN_NOCAPTURE_VMAGIC: '%(' -> type(LEFT_PAREN_NOCAPTURE);
 RIGHT_PAREN_VMAGIC: ')' -> type(RIGHT_PAREN);
 DOT_VMAGIC: '.' -> type(DOT);
 DOTNL_VMAGIC: '\\_.' -> type(DOTNL);
+BACKREFERENCE_VMAGIC: '\\' [0-9] -> type(BACKREFERENCE);
+
+// multi
 STAR_VMAGIC: '*' -> type(STAR);
 PLUS_VMAGIC: '+' -> type(PLUS);
 OPTIONAL_VMAGIC: ('=' | '?') -> type(OPTIONAL);
 ATOMIC_VMAGIC: '@>' -> type(ATOMIC);
-BACKREFERENCE_VMAGIC: '\\' [0-9] -> type(BACKREFERENCE);
+POSITIVE_LOOKAHEAD_VMAGIC: '@=' -> type(POSITIVE_LOOKAHEAD);
 
 RANGE_START_VMAGIC: '{' -> pushMode(INSIDE_RANGE), type(RANGE_START);
 RANGE_START_LAZY_VMAGIC: '{-' -> pushMode(INSIDE_RANGE), type(RANGE_START_LAZY);
@@ -379,11 +389,14 @@ LEFT_PAREN_NOCAPTURE_VNOMAGIC: '\\%(' -> type(LEFT_PAREN_NOCAPTURE);
 RIGHT_PAREN_VNOMAGIC: '\\)' -> type(RIGHT_PAREN);
 DOT_VNOMAGIC: '\\.' -> type(DOT);
 DOTNL_VNOMAGIC: '\\_.' -> type(DOTNL);
+BACKREFERENCE_VNOMAGIC: '\\' [0-9] -> type(BACKREFERENCE);
+
+// multi
 STAR_VNOMAGIC: '\\*' -> type(STAR);
 PLUS_VNOMAGIC: '\\+' -> type(PLUS);
 OPTIONAL_VNOMAGIC: ('\\=' | '\\?') -> type(OPTIONAL);
 ATOMIC_VNOMAGIC: '\\@>' -> type(ATOMIC);
-BACKREFERENCE_VNOMAGIC: '\\' [0-9] -> type(BACKREFERENCE);
+POSITIVE_LOOKAHEAD_VNOMAGIC: '\\@=' -> type(POSITIVE_LOOKAHEAD);
 
 RANGE_START_VNOMAGIC: '\\{' -> pushMode(INSIDE_RANGE), type(RANGE_START);
 RANGE_START_LAZY_VNOMAGIC: '\\{-' -> pushMode(INSIDE_RANGE), type(RANGE_START_LAZY);
diff --git a/vim-engine/src/main/antlr/RegexParser.g4 b/vim-engine/src/main/antlr/RegexParser.g4
index fa4a9510d..e2dcb69c2 100644
--- a/vim-engine/src/main/antlr/RegexParser.g4
+++ b/vim-engine/src/main/antlr/RegexParser.g4
@@ -56,11 +56,12 @@ atom : ordinary_atom                                 #OrdinaryAtom
  * "\?" or "\=" for zero or one times, or a range for a more customizable
  * number of times.
  */
-multi : STAR     #ZeroOrMore
-      | PLUS     #OneOrMore
-      | OPTIONAL #ZeroOrOne
-      | range    #RangeQuantifier
-      | ATOMIC   #Atomic
+multi : STAR               #ZeroOrMore
+      | PLUS               #OneOrMore
+      | OPTIONAL           #ZeroOrOne
+      | range              #RangeQuantifier
+      | ATOMIC             #Atomic
+      | POSITIVE_LOOKAHEAD #PositiveLookahead
       ;
 
 /**