Sha256: 3018c6654ba8a3fdd73632bbba274b42758249a098793238c5df690969f64d31

Contents?: true

Size: 1.76 KB

Versions: 8

Compression:

Stored size: 1.76 KB

Contents

require 'parslet'

module Yoda
  module Parsing
    class CommentTokenizer
      # @return [Sequence]
      def parse(str)
        Generator.new.apply(Tokenizer.new.parse(str))
      end

      class Tokenizer < Parslet::Parser
        rule(:space) { match('\s').repeat(1) }
        rule(:space?) { space.maybe }

        rule(:comment_begin) { str('#') }
        rule(:tag) { str('@') >> (str('!').maybe >> match('[a-zA-Z0-9_-]').repeat) }

        rule(:name) { (sign.absent? >> match['[:graph:]']).repeat(1) }
        rule(:sign) { match['\[\]<>,{}\(\)'] }

        rule(:comment_token) { sign | name }

        rule(:base) { comment_begin.maybe >> space? >> tag.maybe.as(:tag) >> space? >> (comment_token.as(:token) >> space?).repeat.as(:tokens) }
        root :base
      end

      class Generator < Parslet::Transform
        rule(token: simple(:token)) { token }
        rule(tag: simple(:tag), tokens: sequence(:tokens)) { Sequence.new(tag: tag, tokens: tokens) }
        rule(tag: simple(:tag), tokens: simple(:token)) { Sequence.new(tag: tag, tokens: [token]) }
      end

      class Sequence
        # @type Parslet::Slice | nil
        attr_reader :tag

        # @param tag [Parslet::Slice, nil]
        # @param tokens [Array<Parslet::Slice>]
        def initialize(tag: nil, tokens: [])
          fail ArgumentError, tag if tag && !tag.is_a?(Parslet::Slice)
          fail ArgumentError, tokens unless tokens.all? { |token| token.is_a?(Parslet::Slice) }

          @tag = tag
          @tokens = tokens
        end

        # @return [Array<Parslet::Slice>]
        def all_tokens
          @all_tokens ||= [@tag, *parameter_tokens].compact
        end

        # @return [Array<Parslet::Slice>]
        def parameter_tokens
          @tokens
        end
      end
    end
  end
end

Version data entries

8 entries across 8 versions & 1 rubygems

Version Path
yoda-language-server-0.7.2 lib/yoda/parsing/comment_tokenizer.rb
yoda-language-server-0.7.1 lib/yoda/parsing/comment_tokenizer.rb
yoda-language-server-0.7.0 lib/yoda/parsing/comment_tokenizer.rb
yoda-language-server-0.6.2 lib/yoda/parsing/comment_tokenizer.rb
yoda-language-server-0.6.1 lib/yoda/parsing/comment_tokenizer.rb
yoda-language-server-0.6.0 lib/yoda/parsing/comment_tokenizer.rb
yoda-language-server-0.5.0 lib/yoda/parsing/comment_tokenizer.rb
yoda-language-server-0.4.0 lib/yoda/parsing/comment_tokenizer.rb