diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/gitlab/ci/pipeline/expression/lexer.rb | 30 | ||||
-rw-r--r-- | lib/gitlab/ci/pipeline/expression/string.rb | 2 | ||||
-rw-r--r-- | lib/gitlab/ci/pipeline/expression/token.rb | 2 |
3 files changed, 19 insertions, 15 deletions
diff --git a/lib/gitlab/ci/pipeline/expression/lexer.rb b/lib/gitlab/ci/pipeline/expression/lexer.rb index 26895174881..8432b36b066 100644 --- a/lib/gitlab/ci/pipeline/expression/lexer.rb +++ b/lib/gitlab/ci/pipeline/expression/lexer.rb @@ -2,32 +2,34 @@ module Gitlab module Ci module Pipeline module Expression - LEXEMES = [ - Expression::Variable - ] + class Lexer + LEXEMES = [ + Expression::Variable, + Expression::String + ] - MAX_CYCLES = 5 + MAX_CYCLES = 5 + SyntaxError = Class.new(StandardError) - class Lexer def initialize(statement) @scanner = StringScanner.new(statement) @tokens = [] end def tokenize - @tokens.tap do - MAX_CYCLES.times do - LEXEMES.each do |lexeme| - @scanner.scan(/\s+/) # ignore whitespace - - lexeme.scan(@scanner).tap do |token| - @tokens.push(token) if token.present? - end + MAX_CYCLES.times do + LEXEMES.each do |lexeme| + @scanner.scan(/\s+/) # ignore whitespace - return @tokens if @scanner.eos? + lexeme.scan(@scanner).tap do |token| + @tokens.push(token) if token.present? end + + return @tokens if @scanner.eos? end end + + raise Lexer::SyntaxError unless @scanner.eos? end end end diff --git a/lib/gitlab/ci/pipeline/expression/string.rb b/lib/gitlab/ci/pipeline/expression/string.rb index a603ef6cf4c..e6cc50c56d8 100644 --- a/lib/gitlab/ci/pipeline/expression/string.rb +++ b/lib/gitlab/ci/pipeline/expression/string.rb @@ -3,7 +3,7 @@ module Gitlab module Pipeline module Expression class String < Expression::Lexeme - PATTERN = /("|')(?<value>.+)('|")/.freeze + PATTERN = /"(?<string>.+?)"/.freeze def initialize(value) @value = value diff --git a/lib/gitlab/ci/pipeline/expression/token.rb b/lib/gitlab/ci/pipeline/expression/token.rb index c800d1f0c08..03a47a17d40 100644 --- a/lib/gitlab/ci/pipeline/expression/token.rb +++ b/lib/gitlab/ci/pipeline/expression/token.rb @@ -3,6 +3,8 @@ module Gitlab module Pipeline module Expression class Token + attr_reader :value, :type + def initialize(value, type) @value = value @type = type |