Skip to content

Instantly share code, notes, and snippets.

@skord
Created November 15, 2016 20:00
Show Gist options
  • Save skord/1c72b1ba7cc4c271ed48a1a3ff0e9b87 to your computer and use it in GitHub Desktop.
Save skord/1c72b1ba7cc4c271ed48a1a3ff0e9b87 to your computer and use it in GitHub Desktop.
require 'parslet'
require 'parslet/convenience'
module Maxadmin
class Parser < Parslet::Parser
root(:document)
rule(:document) { root }
rule(:root) {(
(match["[:alnum:][:punct:] "].repeat.as(:root) >> newline) >>
items.repeat
).repeat
}
rule(:items) {(list | key_value)}
rule(:list) {
tab.repeat(1) >> alnumspace.repeat.as(:list) >> str(":\n") >>
listitems.repeat.as(:values)
}
rule(:key_value) {
tab.repeat(1) >> key.repeat.as(:key) >> str(":") >>
tabspace.repeat >> value.repeat.as(:value) >> newline
}
rule(:listitems) {(tab.repeat(2) >> value.repeat.as(:value) >> newline)}
rule(:key) {match["0-9A-Za-z \."]}
rule(:value) {match["[0-9A-Za-z], [:punct:]"]}
rule(:space) {match[" "]}
rule(:tabspace) {match["\t "]}
rule(:newline) { str("\r").maybe >> str("\n") | str("\r") >> str("\n").maybe }
rule(:tab) {match["\t"]}
rule(:alnumspace) {match["[0-9A-Za-z] "]}
rule(:alnum) {match["[0-9A-Za-z]"]}
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment