2009-04-24 11 views
5

मैं ट्रिटॉप के लिए नया हूं और एक सीएसएस/एचएसएस पार्सर लिखने का प्रयास कर रहा हूं। एचएसएस ने नेस्टेड शैलियों, चर और एक प्रकार की मिश्रित कार्यक्षमता के साथ सीएसएस की मूल कार्यक्षमता को बढ़ाया है।ट्रिटॉप और नेस्टेड स्टाइलशीट नियमों में सीएसएस/एचएसएस पार्सर

मैं बहुत करीब हूं - पार्सर सीएसएस को संभाल सकता है - लेकिन जब मैं शैली को शैली में लागू करने की बात आती हूं तो मैं गिर जाता हूं। उदाहरण:

#rule #one { 
    #two { 
    color: red; 
    } 
    color: blue; 
} 

मैंने इसमें दो शॉट्स ले लिए हैं, जो व्हाइटस्पेस को नियंत्रित करता है और जो नहीं करता है। मैं काम करने के लिए काफी नहीं मिल सकता है। ट्रीटॉप दस्तावेज थोड़ा सा स्पैस है और मुझे सच में लगता है कि मुझे कुछ मौलिक याद आ रहा है। उम्मीद है कि कोई मुझे सीधे सेट कर सकता है।

एक:

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 

बी:

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 

हार्नेस कोड:

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

क्या आप जो त्रुटि/आउटपुट प्राप्त कर रहे हैं उसे पोस्ट कर सकते हैं? –

उत्तर

3

मैं तुम्हें left recursion समस्याओं में चला रहे हैं मान? यदि ऐसा है, तो ध्यान रखें कि TreeTop recursive descent parsers उत्पन्न करता है, और इस तरह, आप वास्तव में अपने व्याकरण में बाएं रिकर्सन का उपयोग नहीं कर सकते हैं। (मुख्य कारणों में से एक है कि मैं अभी भी बहुत सेक्सी उपस्थिति के बावजूद ट्रीटॉप पर ओकैमलीक/ओकक्लेक्स पसंद करता हूं।) इसका मतलब है कि आपको बाएं रिकर्सिव फॉर्मों से दाएं रिकर्सन में कनवर्ट करना होगा। चूंकि आप निस्संदेह Dragon Book (दाएं?) के स्वामी हैं, इसलिए मैं आपको अनुभाग 4.3.3, 4.3.4, और 4.4.1 पर निर्देशित करूंगा जो इस मुद्दे को कवर करते हैं। जैसा कि सामान्य है, यह समझ में आता है, लेकिन पार्सर्स को कुछ भी नहीं मिला। एक अच्छा left recursion elimination tutorial भी है जो एएनटीएलआर लोगों ने इस विषय पर रखा है। यह कुछ हद तक एएनटीएलआर/एएनटीएलआरवर्क्स विशिष्ट है, लेकिन ड्रैगन बुक में जो पाया गया है उससे समझना थोड़ा आसान है। यह उन चीजों में से एक है जो कभी भी किसी भी व्यक्ति को पूरी तरह से समझ में नहीं आता है जिसने इसे कम से कम कुछ बार नहीं किया है।

इसके अलावा, नाबालिग टिप्पणी, आप Treetop उपयोग करने के लिए जा रहे हैं, मैं इस के बजाय करने की सलाह देते:

def ws 
    [\t ]* 
end 

आप की संभावना नहीं कर रहे हैं कभी लगभग हर व्याकरण एक भी खाली स्थान के चरित्र से मेल खानी चाहिए करने के लिए, के साथ साथ नियम की आवश्यकता होगी, इसलिए इसे बहुत कम नाम देने का अर्थ है। संयोग से, अलग-अलग लेक्सिंग चरण के फायदे हैं। यह उनमें से एक है। हालांकि मुझे लगता है कि वे एक पार्सर इनपुट फ़ाइल के बजाय पार्स करने के लिए नियमित अभिव्यक्ति और एक eval() का उपयोग नोटिस

http://lesscss.org/

:

+0

आह, ठीक है! मुझे लगता है कि ट्रीटॉप बाएं रिकर्सन को संभालने में सक्षम होगा और मैं सिर्फ दस्तावेज़ीकरण में कुछ खो रहा था। इसकी पुष्टि करने के लिए समय निकालने के लिए बहुत बहुत धन्यवाद। – toothygoose

1

ऐसा लगता है कि किसी ने मुझे यह करने के लिए हराया।

संपादित करें: अब वे ट्रीटॉप का उपयोग करते हैं! ऐसा लगता है कि किसी ने मेरे लिए कड़ी मेहनत की है।

संबंधित मुद्दे