Domanda

Sto cercando di utilizzare Treetop per analizzare un file di ERB. Ho bisogno di essere in grado di gestire le linee come il seguente:

<% ruby_code_here %>
<%= other_ruby_code %>

Da Cima è scritto in Ruby, e si scrive Cima di grammatiche in Ruby, c'è già qualche modo esistente in Treetop a dire "Hey, look per il codice Ruby qui, e mi danno la sua ripartizione" senza di me dover scrivere separata regole per gestire tutte le parti del linguaggio Ruby? Sto cercando un modo, nel mio file di grammatica .treetop, per avere qualcosa di simile:

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

Dove ruby_code è gestita da alcune regole che Treetop fornisce.

Modifica analizzata ERB con Rubino -Lex, ma ho avuto errori cercando di riprodurre quello che ha fatto. Il programma rlex non ha prodotto una classe piena quando ha generato la classe parser.

Modifica a destra, in modo che molti sono deprimenti, ma grazie per le info. :) Per il progetto del mio Maestro, sto scrivendo un generatore di banco di prova che ha bisogno di lavorare con ERB come input. Fortunatamente, per i miei scopi, ho solo bisogno di riconoscere alcune cose nel codice ERB, come ad esempio le dichiarazioni if e altri condizionali e loop. Credo di poter venire con Treetop la grammatica in modo che corrisponda, con l'avvertenza che essa non è completa per Ruby.

È stato utile?

Soluzione

Per quanto ne so, nessuno ha ancora creato una grammatica Cima per Ruby. (In realtà, nessuno è mai stato in grado di creare qualsiasi grammatica per Ruby diverso da YACC grammatica fornito con risonanza magnetica e YARV.) So che l'autore di Treetop ha lavorato su uno per diversi anni , ma non è un'impresa da poco. Ottenere la grammatica ANTLR che viene utilizzato in XRuby destra sono voluti circa 5 anni, e non è ancora completamente compatibile.

La sintassi di Ruby è follemente , mindbogglingly complesso.

Altri suggerimenti

No


Non penso così. Specificando il complesso e sottile grammatica Ruby in cima d'albero sarebbe un risultato importante, ma dovrebbe essere possibile.

La grammatica rubino attuale è scritto in yacc. Ora, yacc è uno strumento leggendario, ma le cime degli alberi genera una più potente classe di parser, quindi dovrebbe essere possibile e forse qualcuno l'ha fatto.

Non è un progetto di pomeriggio.

Può essere che io stia scherzando ma se yacc è meno complessa rispetto rubino allora si potrebbe realizzare yacc in cima d'albero che utilizzi che la grammatica rubino creato per yacc.

Per i vostri scopi, probabilmente si potranno ottenere via senza l'analisi di tutti di Ruby. Quello che realmente bisogno è un modo per rilevare l'%> che chiude un blocco Ruby. Se non si vuole mai fallire quando il codice Ruby contiene quei personaggi di chiusura, è necessario rilevare ovunque questi personaggi possono verificarsi all'interno del testo di Ruby; che significa che è necessario rilevare tutte le forme di letterali.

Comunque per voi scopi probabilmente si può ottenere via con il riconoscimento più probabili casi in cui%> si sarebbe verificato nel testo Ruby, e ignorare solo quei casi. Ciò presuppone, naturalmente, che qualsiasi guasto rimanente può essere gestito da ottenere il vostro utente di scrivere l'ERB un po 'diverso.

Per quello che vale, Cima di albero in sé "analizza" Blocchi di Ruby in questo modo; IT solo conta {e} caratteri fino a quella di chiusura viene trovato. Così, se il blocco contiene un} in una stringa letterale, sei rotto (ma è possibile aggirare includendo l'abbinamento uno in un commento).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top