2009-04-24 15 views
5

Soy nuevo en Treetop e intento escribir un analizador de CSS/HSS. HSS aumenta la funcionalidad básica de CSS con estilos anidados, variables y un tipo de funcionalidad mixin.Analizador de CSS/HSS en Treetop y reglas de hojas de estilo anidadas

Estoy bastante cerca - el analizador puede manejar CSS - pero me caigo cuando se trata de implementar un estilo dentro de un estilo. por ejemplo:

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

Me he tomado dos tiros en él, uno que se ocupa de los espacios en blanco y uno que no lo hace. No puedo llegar a trabajar. La documentación sobre los árboles es un poco escasa y realmente siento que me falta algo fundamental. Espero que alguien me pueda aclarar.

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 

Código Arnés:

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

¿Puedes publicar el error/resultado que recibes? –

Respuesta

3

supongo que se está ejecutando en left recursion problemas? Si es así, tenga en cuenta que TreeTop produce recursive descent parsers, y como tal, no puede usar la recursividad a la izquierda en su gramática. (Una de las razones principales por las que todavía prefiero ocamlyacc/ocamllex sobre TreeTop a pesar de su apariencia muy sexy.) Esto significa que necesita convertir de formas recursivas a la recursividad correcta. Como sin duda es propietario del Dragon Book (¿verdad?), Lo dirigiré a las secciones 4.3.3, 4.3.4 y 4.4.1 que cubren el problema. Como es típico, es difícil de entender, pero los analizadores no obtuvieron su reputación por nada. También hay un buen left recursion elimination tutorial que los chicos de ANTLR ponen sobre el tema. Es algo ANTLR/ANTLRworks específico, pero es un poco más fácil de entender que lo que se encuentra en el Libro del Dragón. Esta es una de esas cosas que simplemente no tiene mucho sentido para nadie que no lo haya hecho al menos algunas veces.

También, pequeño comentario, si se va a utilizar Cima del árbol, recomiendo hacer esto en su lugar:

def ws 
    [\t ]* 
end 

No es probable que necesite nunca para que coincida con un único carácter de espacio en blanco, además de casi todos gramática la regla lo va a necesitar, por lo que tiene sentido llamarlo algo muy corto. Por cierto, hay ventajas de en un paso de lexing separado. Este es uno de ellos.

+0

¡Ah, claro! Supuse que TreeTop podría manejar la recursividad a la izquierda y me faltaba algo en la documentación. Muchas gracias por tomarse el tiempo para confirmar esto. – toothygoose

1

Parece que alguien se me adelantó:

http://lesscss.org/

Aunque noto que utilizan expresiones regulares y una eval() para analizar el archivo de entrada en lugar de un programa de análisis.

Editar: ¡Ahora usan TreeTop! Es como si alguien hubiera hecho todo el trabajo duro por mí.

Cuestiones relacionadas