Pergunta

Preciso implementar compilador (analisadores léxicos, sintáticos e semânticos).Já implementei o léxico de flex++, sintaxe de mão (descida recursiva), e sei que estou trabalhando em semântica (adicionando regras semânticas ao analisador existente).Minha pergunta é: como implementar atributos.Por exemplo, para produção:

TYPE -> integer

Preciso adicionar regra semântica:

TYPE.type = integer

Então aqui preciso criar alguma estrutura para TYPE e assim por diante para todos os símbolos gramaticais.Então, como faço para implementar essas estruturas?Preciso criar alguma estrutura para cada símbolo gramatical e ela precisa ser global para o escopo do arquivo?

p.s.talvez não seja a melhor implementação do compilador, é apenas um requisito para atribuição.

Foi útil?

Solução

É mais fácil se você definir um tipo (normalmente uma estrutura) para cada terminal e não terminal em seu idioma.Então, cada uso de um (não) terminal tem acesso ao tipo, e cada atribuição de um atributo vai contra o slot correspondente na estrutura associada ao (não) terminal.

Sugiro que você nomeie suas estruturas de implementação com base nos tokens gramaticais.Portanto, o tipo de estrutura de atributos para T seria "T_attributes {...}"

Para o seu exemplo, "type" seria um slot em T_attributes.Provavelmente o que você pretendia escrever no resumo era:

TYPE -> 'integer' ;  -- 'integer is a keyword'
TYPE.type = "int";   -- the type of an 'integer' is "int"

Dado que você está fazendo isso manualmente, você compilará manualmente a atribuição de atributos para executar quando uma caminhada na árvore atingir o nó TYPE.

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