Pergunta

Estou desenvolvendo um intérprete de uma linguagem de programação simples.

  1. Existem dados dinâmicos com estrutura de árvore , onde cada um dos nós de dados tem um associado (propriedade) tipo de objeto .
  2. Existem vários tipos de tipos - listType, StructType etc. - e um especial - TypeRef . O TypeRef detém um nome (uma string), que se refere a algum tipo de concreto.
  3. Há um mapa (quase) global (dicionário) - Eu o chamo de ambiente -. (std::map<string, Type*>) que traduz-tipo nomes em objetos de tipos

O problema é que pode haver vários programas carregados e cada um deles pode ter diferentes tipos associados com os mesmos nomes. Esta única suposição torna impossível ter um ambiente global (estática), que de outra forma seria uma solução perfeita.

Portanto, parece que preciso quer (# 1) um ponteiro para um ambiente em cada objeto tipo ou (# 2) para realizar cada operação no contexto do ambiente (por exemplo, fornecendo-lhe toda a parte como o primeiro argumento ).

Os problemas que vejo:
(# 1) redundância de informação, porque todos os nós de dados conectadas teria o mesmo ambiente. Ambientes só seria diferente para dados estritamente separadas.
(# 2) Um monte de passagem trivial do ambiente de sub-rotinas, ofuscar o código.

Parece-me que este problema corresponde a um padrão geral eu chamaria dados quase estática . Alguma idéia o que seria a melhor solução?

Foi útil?

Solução 3

A idéia de usar o armazenamento local de segmento é interessante, mas eu tenho finalmente acabar com uma outra solução:

Eu uso os tipos em duas fases: primeiro, eles são todos criados e então eles são "compilados". Compilação requer um ambiente, mas é realizada apenas uma vez. Consiste em traduzir todos os nomes de tipo em tipo de objetos-adequadas. Após a compilação o meio ambiente não é mais necessária.

No entanto, eu acho que ainda é mais uma solução do que uma solução geral.

Outras dicas

O que separa os ambientes? Se for o contexto de execução (objetos em um contexto únicos de chamada no mesmo contexto), então você pode usar um thread por ambiente e armazenar os "locais-globals" em um dispositivo de armazenamento local de segmento (ou apenas um mapa global com chaves sendo IDs de rosca).

Isto tem algumas desvantagens. Por um lado, ele não funciona se não houver chamadas cross-contexto. E é claro que o obriga a um modelo de rosca.

Você pode querer ter dois armazenamentos tipo - um global para tipos de concreto, um local para TypeRefs. armazenamento local deve ser colocado em contexto de um programa que está sendo analisado.

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