Implementação de atributos de símbolos gramaticais em C
-
12-12-2019 - |
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.
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.