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 ; /**