Pergunta

Eu estou tentando usar o Treetop para analisar uma ERB arquivo.Eu preciso ser capaz de lidar com linhas como as seguintes:

<% ruby_code_here %>
<%= other_ruby_code %>

Desde que o Treetop está escrito em Ruby, e você escreve Treetop gramáticas em Ruby, há já alguns existente caminho na Árvore para dizer "ei, olhe para o código de Ruby aqui, e me dê a sua desagregação" sem mim, ter de escrever as regras separadas para lidar com todas as partes do Ruby como linguagem?Estou à procura de uma forma, no meu .treetop arquivo de gramática, para ter algo como:

rule erb_tag
  "<%" ruby_code "%>" {
    def content
      ...
    end
  }
end

Onde ruby_code é tratado por algumas regras que Treetop oferece.

Editar: alguém analisado ERB, utilizando Ruby-lex, mas eu tenho erros tentando reproduzir o que ele fez.O rlex programa não produzir uma classe completa quando é gerado o analisador de classe.

Editar: certo, então você são muito deprimente, mas obrigado pela informação.:) Para o meu projeto de Mestrado, estou a escrever um caso de teste gerador de que necessita para trabalhar com a ERB como entrada.Felizmente, para os meus propósitos, eu só preciso reconhecer algumas coisas na ERB código, tais como if declarações e outros condicionais, bem como loops.Eu acho que pode vir até com o Treetop gramática para combinar que, com a ressalva de que ele não está completa do Ruby.

Foi útil?

Solução

Até onde eu sei, ninguém ainda criou uma gramática na copa do rubi. (De fato, ninguém nunca foi capaz de criar algum Gramática para Ruby, exceto a gramática YACC que envia uma ressonância magnética e Yarv.) Eu sei que o autor de Treetop trabalha em um há vários anos, mas não é um empreendimento trivial. A obtenção da gramática ANTLR, que é usada no Xruby, levou cerca de 5 anos, e ainda não é totalmente compatível.

A sintaxe de Ruby é insanamente, Mindboggllingly Complex.

Outras dicas

Não


Eu não acho. Especificar a gramática rubi complexa e sutil na Treetop seria uma grande conquista, mas deve ser possível.

O Ruby Grammer real está escrito em YACC. Agora, o YACC é uma ferramenta lendária, mas a Treetop gera uma classe mais poderosa de analisadores, por isso deve ser possível e talvez alguém tenha feito isso.

Não é um projeto da tarde.

Pode ser que estou brincando, mas se o YACC for menos complexo que o Ruby, você poderá perceber o YACC na árvore que usa a gramática do rubi criada para o YACC.

Para seus objetivos, você pode, provavelmente, sair sem analisar todos Ruby.O que você realmente precisa é de uma forma de detectar a %> que fecha um Rubi bloco.Se você não quer falhar quando o código de Ruby contém os caracteres de fechamento, deve-se identificar em qualquer lugar desses caracteres pode ocorrer dentro do texto Rubi;o que significa que você precisa para detectar todas as formas de literais.

No entanto, para que fins você pode provavelmente começar afastado com o reconhecimento de que o mais provável casos onde %> deverá ocorrer em Ruby texto, e ignorar apenas nesses casos.Isso pressupõe, naturalmente, que o restante de falha pode ser processado por fazer o seu utilizador para escrever a ERB um pouco diferente.

Por que vale a pena, pelas copas das árvores em si "analisa" Ruby blocos desta forma;ele apenas conta { e } caracteres até o fechamento for encontrado.Então, se o seu bloco contém um } uma cadeia literal, você está com defeito (mas você pode contornar incluindo a correspondência de um em um comentário).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top