Treetop'a yeni ve bir CSS/HSS ayrıştırıcısı yazmaya çalışıyorum. HSS, iç içe geçmiş stiller, değişkenler ve bir tür mixin işlevselliği ile CSS'nin temel işlevlerini artırır.CSS/HSS Ayrıştırıcısı
Çok yakınım - ayrıştırıcı CSS'yi işleyebilir - ancak bir stilde bir stili uygulandığında düşüyorum. örneğin, iki boşluk çekildi, bunlardan biri, boşlukları idare eden ve yapmayan iki tane fotoğraf çekmişti. Ya işe yaramıyor. Treetop belgeleri biraz seyrek ve gerçekten temel bir şey eksik gibi hissediyorum. Umarım birisi beni düzeltebilir.
A:
grammar Stylesheet
rule stylesheet
space* style*
end
rule style
selectors space* '{' space* properties? space* '}' space*
end
rule properties
property space* (';' space* property)* ';'?
end
rule property
property_name space* [:] space* property_value
end
rule property_name
[^:;}]+
end
rule property_value
[^:;}]+
end
rule space
[\t ]
end
rule selectors
selector space* ([,] space* selector)*
end
rule selector
element (space+ ![{] element)*
end
rule element
class/id
end
rule id
[#] [a-zA-Z-]+
end
rule class
[.] [a-zA-Z-]+
end
end
B:
grammar Stylesheet
rule stylesheet
style*
end
rule style
selectors closure
end
rule closure
'{' (style/property)* '}'
end
rule property
property_name ':' property_value ';'
end
rule property_name
[^:}]+
<PropertyNode>
end
rule property_value
[^;]+
<PropertyNode>
end
rule selectors
selector (!closure ',' selector)*
<SelectorNode>
end
rule selector
element (space+ !closure element)*
<SelectorNode>
end
rule element
class/id
end
rule id
('#' [a-zA-Z]+)
end
rule class
('.' [a-zA-Z]+)
end
rule space
[\t ]
end
end
Harness Kodu:
require 'rubygems'
require 'treetop'
class PropertyNode < Treetop::Runtime::SyntaxNode
def value
"property:(#{text_value})"
end
end
class SelectorNode < Treetop::Runtime::SyntaxNode
def value
"--> #{text_value}"
end
end
Treetop.load('css')
parser = StylesheetParser.new
parser.consume_all_input = false
string = <<EOS
#hello-there .my-friend {
font-family:Verdana;
font-size:12px;
}
.my-friend, #is-cool {
font: 12px Verdana;
#he .likes-jam, #very-much {asaads:there;}
hello: there;
}
EOS
root_node = parser.parse(string)
def print_node(node, output = [])
output << node.value if node.respond_to?(:value)
node.elements.each {|element| print_node(element, output)} if node.elements
output
end
puts print_node(root_node).join("\n") if root_node
#puts parser.methods.sort.join(',')
puts parser.input
puts string[0...parser.failure_index] + '<--'
puts parser.failure_reason
puts parser.terminal_failures
Aldığınız hatayı/çıktıyı kaydeder misiniz? –