Sha256: 357137e8f0a88096a99186b874595c2a0b27135c8a49824deba375990fb4cd6a
Contents?: true
Size: 1.48 KB
Versions: 1
Compression:
Stored size: 1.48 KB
Contents
# frozen_string_literal: true require 'parslet' module Timetrack # Read an IO and parse it into an AST class Parser < Parslet::Parser rule(:eof) { any.absent? } rule(:newline) { match['\n'] } rule(:space) { str ' ' } rule(:gutter) { space.repeat(2) } rule(:to_eol) { match['^\n'].repeat } rule(:task) { match('\d').repeat(6).as(:task) } rule(:year) { match['\d'].repeat 4 } rule(:month) { match['\d'].repeat 2 } rule(:day) { match['\d'].repeat 2 } rule(:date) { year >> str('/') >> month >> str('/') >> day } rule(:hour) { match['\d'].repeat 2 } rule(:minute) { match['\d'].repeat 2 } rule(:time) { hour >> str(':') >> minute } rule(:begin_time) { (gutter >> time.as(:begin)) } rule(:end_time) { (gutter >> time.as(:end)).maybe } rule(:times) { begin_time >> end_time } rule(:text) { match['[^\n]'].repeat } rule(:comment) { str(';') >> match['\s'].repeat >> text.as(:comment) } rule(:comment_block) { (gutter >> comment).maybe } rule(:submission_marker) { str('*').as(:submitted) } rule(:submission_block) { (submission_marker >> space).maybe } rule(:event) do gutter >> submission_block >> task >> times >> comment_block >> to_eol end rule(:events) { (event.as(:event) >> newline).repeat } rule(:event_day) { date >> newline >> events } rule(:days) do (event_day.as(:day) >> newline.repeat).repeat end rule(:document) { days >> newline.repeat >> eof } root :document end end
Version data entries
1 entries across 1 versions & 1 rubygems
Version | Path |
---|---|
timetrack-0.1.0 | lib/timetrack/parser.rb |