Pergunta

Estou pensando em implementar um tradutor XML usando um gerador de compilador, baseado no W3C XML1.1 spec, que inclui uma gramática EBNF completa.

Mais precisamente, pretendo usar Qi-YACC porque quero aprender essa ferramenta.Será minha primeira incursão no uso de qualquer compilador-compilador.

O primeiro tipo de tradução que pretendo implementar é muito simples:XML para S-EXPRs.Depois pretendo generalizar meu tradutor, mas esse não é o objetivo da minha pergunta.

Você prevê alguma grande armadilha para esse tipo de projeto? Eu li que traduzir XML usando seu EBNF é Uma má ideia.Eu quero saber porque.E não é como se a linguagem Qi já tivesse um analisador XML, então definitivamente não estou querendo reinventar a roda aqui.

Foi útil?

Solução

Não sei agora a razão pela qual o contexto é necessário para analisar XML.

Mas o QiYacc pode fazer uso do contexto usando variáveis ​​globais.Seria mais limpo se você pudesse passar por um estado, s, no analisador, por exemplo,ou algo assim.Isso não está no Qi, mas pretendo implementar esse recurso para Shen.

Então isso poderia ser feito.

/Stefan

Outras dicas

Não sei nada sobre Qiyacc, no entanto, traduzir um eBNF de XML em um analisador de descida recursiva (RD) é mais ou menos direta. Só é preciso ter em mente o fato de que existem lugares onde alguns pequenos ajustes na gramática podem ter um grande impacto no analisador. Isso ocorre porque as gramáticas são escritas com sucinta e clareza em mente, em vez de tentar evitar perseguir as regras.

Fiz algo assim uma vez em C ++ escrevendo a gramática do XML como um conjunto de tipos. Você pode ver um artigo que escrevi sobre ele Projeto de código. Os mesmos princípios básicos podem ser aplicados a qualquer idioma.

Eu também sugiro que você olhe em volta para as gramáticas da PEG. Eles se estendem ao EBNF, permitindo que você introduza afirmações de largura zero e são uma ótima maneira de aumentar uma gramática EBNF para um analisador.

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