Isso faz parte de uma série de perguntas que se concentram no projeto irmão do Abstraction Project, que visa abstrair os conceitos usados no design de linguagem na forma de uma estrutura. O projeto irmão é chamado OILexer, que visa construir um analisador a partir de arquivos gramaticais, sem o uso de injeção de código em correspondências.
Algumas outras páginas associadas a essas perguntas, relacionadas à tipagem estrutural, podem ser visualizadas aqui , e a facilidade de uso, encontrada aqui . O meta-tópico associado a uma consulta sobre a estrutura e o local apropriado para publicação pode ser encontrado aqui .
Estou chegando ao ponto em que estou prestes a começar a extrair a árvore de análise de uma determinada gramática, seguida por um analisador de Descida Recursiva que usa o DFA para discernir caminhos avançados (semelhante ao LL do ANTLR 4 (*)), então eu achei que eu iria abri-lo para ter uma ideia.
Em um compilador de analisador, que tipos de recursos são ideais?
Até agora, aqui está uma breve visão geral do que é implementado:
- Modelos
- Preveja a previsão, sabendo o que é válido em um determinado momento.
- Regra 'Deliteralização', levando os literais dentro das regras e resolvendo de qual token eles são.
- Autômatos não determinísticos
- Autômatos determinísticos
- Máquina de estado lexical simples para reconhecimento de token
- Métodos de automação de token:
- Varredura - útil para comentários: Comentário: = "/ *" Varredura ("* /");
- Subtrair - Útil para Identificadores: Identificador: = Subtrair (IdentifierBody, Palavras-chave);
- Garante que o identificador não aceite palavras-chave.
- Codificar - Codifica uma automação como uma contagem X da série de transições de base N.
- UnicodeEscape: = "\\ u" BaseEncode (IdentifierCharNoEscape, 16, 4);
- Faz um escape unicode em hexadecimal, com 4 transições hexadecimais. A diferença entre isso e: [0-9A-Fa-f] {4} é que a automação resultante com Encode limita o conjunto permitido de valores hexadecimais ao escopo do IdentifierCharNoEscape. Portanto, se você especificar \ u005c, a versão do código não aceitará o valor. Coisas assim têm uma advertência séria: use com moderação. A automação resultante pode ser bastante complexa.
- UnicodeEscape: = "\\ u" BaseEncode (IdentifierCharNoEscape, 16, 4);
O que não é implementado é a geração de CST, preciso ajustar as automações determinísticas para manter o contexto adequado para que isso funcione.
Para qualquer pessoa interessada, enviei uma linda versão impressa da forma original do projeto T * y♯ . Cada arquivo deve ser vinculado a qualquer outro arquivo. Comecei a vincular as regras individuais para segui-las, mas isso levaria muito tempo (seria mais fácil automatizar!)
Se for necessário mais contexto, poste em conformidade.
Editar 14-14-2013 : escrevi código para criar gráficos GraphViz para as máquinas de estado em um determinado idioma. Aqui está um dígrafo GraphViz da AssemblyPart . Os membros vinculados na descrição do idioma devem ter um rulename.txt em sua pasta relativa, com o dígrafo dessa regra. Parte da descrição do idioma mudou desde que eu postei o exemplo, isso se deve à simplificação das coisas sobre a gramática. Aqui está uma imagem gráfica interessante .