From 7156be1328439ae44404db69db6936b1f8480718 Mon Sep 17 00:00:00 2001 From: Roman Dvornov Date: Tue, 15 May 2018 15:12:55 +0300 Subject: [PATCH] refactoring of match --- lib/lexer/match.js | 30 ++++++++++++------------------ 1 file changed, 12 insertions(+), 18 deletions(-) diff --git a/lib/lexer/match.js b/lib/lexer/match.js index c6366a04..660909df 100644 --- a/lib/lexer/match.js +++ b/lib/lexer/match.js @@ -59,21 +59,18 @@ function internalMatch(tokens, syntax, syntaxes) { function addTokenToStack() { var matchToken = token; - var matchTokenCursor = tokenCursor; moveToNextToken(); matchStack = { type: 'Token', - size: matchStack.size + 1, syntax: syntaxNode, token: matchToken, - tokenCursor: matchTokenCursor, prev: matchStack }; - if (matchStack.size > bestMatch.size) { - bestMatch = matchStack; + if (tokenCursor > longestMatch) { + longestMatch = tokenCursor; } return matchToken; @@ -88,10 +85,8 @@ function internalMatch(tokens, syntax, syntaxes) { matchStack = { type: 'Open', - size: matchStack.size, syntax: syntaxNode, token: matchStack.token, - tokenCursor: matchStack.tokenCursor, prev: matchStack }; } @@ -103,10 +98,8 @@ function internalMatch(tokens, syntax, syntaxes) { } else { matchStack = { type: 'Close', - size: matchStack.size, syntax: syntaxStack.syntax, token: matchStack.token, - tokenCursor: matchStack.tokenCursor, prev: matchStack }; } @@ -114,8 +107,8 @@ function internalMatch(tokens, syntax, syntaxes) { syntaxStack = syntaxStack.prev; } - var matchStack = { type: 'Stub', size: 0, syntax: null, token: null, tokenCursor: -1, prev: null }; - var bestMatch = matchStack; + var matchStack = { type: 'Stub', syntax: null, token: null, tokenCursor: -1, prev: null }; + var longestMatch = 0; var tokenCursor = -1; var token = moveToNextToken(); @@ -124,7 +117,7 @@ function internalMatch(tokens, syntax, syntaxes) { var elseStack = null; var syntaxNode = syntax; - var LIMIT = 20000; + var LIMIT = 5000; var iterationCount = 0; // var x = syntaxNode; @@ -184,7 +177,7 @@ function internalMatch(tokens, syntax, syntaxes) { } // close syntax if needed - if (syntaxStack !== null && thenStack.syntaxStack !== syntaxStack) { + while (syntaxStack !== null && thenStack.syntaxStack !== syntaxStack) { closeSyntax(); } @@ -206,8 +199,8 @@ function internalMatch(tokens, syntax, syntaxes) { thenStack = elseStack.thenStack; syntaxStack = elseStack.syntaxStack; matchStack = elseStack.matchStack; - tokenCursor = matchStack.size === 0 ? -1 : matchStack.tokenCursor; - token = moveToNextToken(); + tokenCursor = elseStack.tokenCursor; + token = elseStack.token; // pop stack elseStack = elseStack.prev; @@ -223,6 +216,8 @@ function internalMatch(tokens, syntax, syntaxes) { matchStack: matchStack, syntaxStack: syntaxStack, thenStack: thenStack, + tokenCursor: tokenCursor, + token: token, prev: elseStack }; } @@ -353,7 +348,7 @@ function internalMatch(tokens, syntax, syntaxes) { totalIterationCount += iterationCount; if (syntaxNode === MATCH) { - while (syntaxStack) { + while (syntaxStack !== null) { closeSyntax(); } @@ -364,8 +359,7 @@ function internalMatch(tokens, syntax, syntaxes) { error: null }; } else { - tokenCursor = bestMatch.tokenCursor; - moveToNextToken(); + token = tokens[longestMatch >= tokens.length ? tokens.length - 1 : longestMatch]; for (var value = '', offset = 0, i = 0; i < tokens.length; i++) { var testToken = tokens[i];