Pergunta

Além de obter qualquer trabalho de verdade, tenho uma coceira. Meu coceira é para escrever um mecanismo de exibição que imita um sistema modelo de outro idioma (Template Toolkit / Perl). Este é um daqueles se eu tivesse tempo / fazê-lo para aprender algo novo tipo de projectos.

Eu passei tempo a olhar para CoCo / R e ANTLR, e honestamente, não faz o meu mal cérebro, mas alguns dos CoCo / R está afundando. Infelizmente, a maioria dos exemplos são sobre a criação de um compilador que lê o código fonte , mas nenhum parecem cobrir como criar um processador de templates.

Sim, esses são a mesma coisa, mas eu não posso envolver minha cabeça em torno de como definir o idioma para modelos onde a maioria da fonte é o html, em vez de código real que está sendo analisado e executado.

Existem bons recursos iniciantes lá fora para esse tipo de coisa? Eu tomei um Ganer no Spark, que não parecem ter a gramática no repo.

Talvez seja um exagero, e pode-se apenas test-substituir sintaxe do modelo com c # no arquivo e compilá-lo. http://msdn.microsoft.com/en-us/magazine/ cc136756.aspx # S2

Se você estivesse no meu lugar e não eram uma linguagem de criação de especialista, onde gostaria de começar?

Foi útil?

Solução

A gramática Spark é implementado com uma linguagem específica de domínio tipo-de-fluente.

É declarada em algumas camadas. As regras que reconhecem a sintaxe html são declaradas em MarkupGrammar.cs -. aqueles são baseados em regras gramaticais copiados diretamente do especificação xml

As regras de marcação referem-se a um subconjunto limitado de regras de sintaxe csharp declarado em CodeGrammar.cs -. estas são um subconjunto porque faísca só precisa reconhecer csharp suficiente para ajustar aspas simples em torno de cordas para aspas, corresponder chaves Curley, etc

As regras individuais em si são do tipo ParseAction < TValue> delegar que aceitar um href="http://github.com/loudej/spark/blob/master/src/Spark/Parser/Position.cs" rel="nofollow noreferrer"> Posição e retornar um ParseResult . O ParseResult é uma classe simples que contém o item de dados TValue analisado pela ação e uma nova instância posição que tem sido avançado passado o conteúdo que produziu o TValue.

Isso não é muito útil, por si própria até que você introduzir um pequeno número de operadores , conforme descrito no análise da expressão gramática , que pode combinar ações individuais de análise para construir expressões muito detalhado e robustos sobre a forma de diferentes construções de sintaxe.

A técnica de usar um delegado como uma ação de análise veio do post de um Luke H Monádicos analisador Combinadores usando C # 3.0 . Eu também escrevi um post sobre Criando uma Domain Specific idioma para analisar .

Também é perfeitamente possível, se quiser, para fazer referência ao Spark.dll montagem e herdar uma classe a partir da base CharGrammar para criar uma inteiramente nova gramática para uma sintaxe particular. É provavelmente a maneira mais rápida para começar a experimentar com esta técnica, e um exemplo de que pode ser encontrado em CharGrammarTester.cs .

Outras dicas

Passo 1. Use expressões regulares (substituição de expressão regular) para dividir a seqüência de modelo de entrada para uma lista de símbolos, por exemplo, dividir

hel<b>lo[if foo]bar is [bar].[else]baz[end]world</b>!

para

write('hel<b>lo')
if('foo')
write('bar is')
substitute('bar')
write('.')
else()
write('baz')
end()
write('world</b>!')

Passo 2. Converta sua lista de token para uma árvore de sintaxe:

* Sequence
** Write
*** ('hel<b>lo')
** If
*** ('foo')
*** Sequence
**** Write
***** ('bar is')
**** Substitute
***** ('bar')
**** Write
***** ('.')
*** Write
**** ('baz')
** Write
*** ('world</b>!')

class Instruction {
}
class Write : Instruction {
  string text;
}
class Substitute : Instruction {
  string varname;
}
class Sequence : Instruction {
  Instruction[] items;
}
class If : Instruction {
  string condition;
  Instruction then;
  Instruction else;
}

Passo 3. Escreva uma função recursiva (chamado de intérprete), que pode andar de sua árvore e executar as instruções.

Outra abordagem alternativa (em vez de passos 1--3) se os seus suportes de linguagem eval () (como Perl, Python, Ruby): usar uma substituição regexp para converter o modelo a um eval () - seqüência capaz de a língua de acolhimento, e eval run () para instanciar o modelo.

Há sooo muitas coisas para fazer. Mas ela não funciona para a instrução GET simples mais um teste. Isso é um começo.

http://github.com/claco/tt.net/

No final, eu já tinha muito tempo em ANTLR para dar método loudejs um ir. Eu queria passar um pouco de tempo mais em todo o processo, em vez do analisador / lexer. Talvez na versão 2 I pode ter um ir para o caminho faísca quando meu cérebro entende as coisas um pouco mais.

Vici Analisador (anteriormente conhecido como LazyParser.NET) é um código-fonte aberto tokenizer analisador / template analisador / expressão que pode ajudar você a começar.

Se não é o que você está procurando, então você pode ter algumas idéias, olhando para o código-fonte.

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