Last active
December 19, 2017 07:07
-
-
Save codeout/a5a47e4143c2473767a509d25ddcb036 to your computer and use it in GitHub Desktop.
Example of junoser-squash.rb
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
require 'junoser' | |
require 'parslet' | |
module Junoser | |
module Display | |
class DeleteTransformer < Parslet::Transform | |
rule(config: simple(:config)) do | |
"(#{config.to_s}" | |
end | |
rule(config: sequence(:configs)) do | |
configs.join("\n") | |
end | |
rule(arg: simple(:arg)) do | |
arg | |
end | |
rule(label: simple(:label)) do | |
")#{Regexp.escape(label.to_s)}" | |
end | |
rule(label: simple(:label), child: simple(:child)) do | |
"#{Regexp.escape(label.to_s)} #{child}" | |
end | |
rule(label: simple(:label), child: sequence(:children)) do | |
%[#{Regexp.escape(label.to_s)} #{children.join(' ')}] | |
end | |
rule(statement: simple(:statement), argument: simple(:argument)) do | |
"#{statement} #{argument}" | |
end | |
rule(statement: simple(:statement), argument: sequence(:arguments)) do | |
%[#{statement} #{arguments.join(' ')}] | |
end | |
rule(oneline: simple(:str)) do | |
str | |
end | |
rule(oneline: sequence(:strs)) do | |
strs.join(' ') | |
end | |
end | |
class SetLinesWithCommands | |
def initialize(io) | |
@io = io | |
@lines = [] | |
@parser = Junoser::Parser.new | |
@transformer = DeleteTransformer.new | |
end | |
def process | |
while l = $<.gets | |
l.strip! | |
case l | |
when /^set / | |
@lines << l | |
when /^delete / | |
to_delete = @parser.parse(l.gsub(/^delete /, 'set ')) | |
delete_lines @transformer.apply(to_delete) | |
end | |
end | |
@lines.uniq.map(&:strip).join("\n") | |
end | |
private | |
def delete_lines(pattern) | |
@lines.each do |l| | |
l.sub!(/#{pattern}/) { $1 } | |
end | |
end | |
end | |
end | |
end | |
lines = Junoser::Display::SetLinesWithCommands.new($<) | |
puts lines.process |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
実行例
入力ファイル (
config
)出力例