2009-04-24 17 views
5

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 
+0

Aldığınız hatayı/çıktıyı kaydeder misiniz? –

cevap

3

Sana left recursion sorunlarla koşuyoruz varsayıyorum? Eğer öyleyse, TreeTop'un recursive descent parsers'u ürettiğini ve böylelikle dilbilgisinde sol özyinelemeyi kullanamazsınız. (Hala çok seksi görünmesine rağmen TreeTop üzerinden ocamlyacc/ocamllex'i tercih etmemin en önemli nedenlerinden biri.) Bu, sol özyinelemeli formlardan doğru özyinelemeye dönüştürmeniz gerektiği anlamına gelir. Hiç şüphesiz Dragon Book (sağda?) Sahibi olduğunuzdan, sizi sorunu kapsayan 4.3.3, 4.3.4 ve 4.4.1 bölümlerine yönlendireceğim. Tipik olduğu gibi, anlaşılması zor, ancak ayrıştırıcılar hiçbir şey için itibarlarını alamadılar. Ayrıca, ANTLR adamlarının konuya koyduğu güzel bir left recursion elimination tutorial var. Biraz ANTLR/ANTLRworks özel, ama Ejderha Kitabı'nda bulunandan anlamak biraz daha kolay. Bu, hiç olmazsa birkaç kez daha önce yapmayan herkese pek bir şey ifade etmeyen şeylerden biri. Eğer TreeTop kullanmaya gidiyoruz

Ayrıca

, minör yorum, ben yerine bunu tavsiye:

def ws 
    [\t ]* 
end 

Muhtemelen değiliz şimdiye kadar tek bir boşluk karakteri eşleştirmek gerekir, ayrıca hemen hemen her dilbilgisi için Kural buna ihtiyaç duyacaktır, bu yüzden ona çok kısa bir isim vermek mantıklıdır. Bu arada, ayrı bir lexing adımı için avantajları vardır. Bu onlardan biri. Birisi beni alt gibi

+0

Ah, doğru! TreeTop'un sol özyinelemeyi üstlenebileceğini ve belgelerindeki bir şeyi kaçırdığımı varsaydım. Bunu onaylamak için zaman ayırdığınız için çok teşekkürler. – toothygoose

1

görünüyor:

http://lesscss.org/

onlar girdi dosyasını yerine ayrıştırıcı ayrıştırmak için normal ifadeler ve eval() kullanmak olduğunu fark rağmen.

Düzenleme: Şimdi TreeTop'u kullanıyorlar! Benim için tüm zor işleri yapan biri gibi.

İlgili konular