Há duas partes da semântica que você precisará descrever:
A semântica estática geralmente assume a forma de sistemas de tipos. Eu recomendo olhar os livros de Benjamin C Pierce e Robert Harper . Como alternativa, você pode escrever as regras de programas bem formados como uma coleção de instruções (formais ou informais) que descrevem as condições de validade do seu programa. A abordagem formal adotada pelos sistemas de tipos fornece uma estrutura bem conhecida para essas especificações.
Existem muitos formalismos para expressar a semântica dinâmica a ser considerada como sua base:
- semântica denotacional --- dá significado em termos de domínios semânticos
- semântica operacional --- dá significado em termos de mudanças nos estados abstratos de uma máquina
- semântica axiomática --- dá significado em termos de afirmações sobre o estado da máquina
- semântica algébrica --- a semântica é definida em termos de leis algébricas.
Deve haver muitos livros sobre esses tópicos. Uma boa introdução é Nielson e a Semantics with Applications de Nielson . Uma versão para download está disponível no site dos autores . Há também uma edição mais recente, mas ainda não a vi.
Dentro de cada uma delas, há opções a serem feitas. Por exemplo, se você decidir usar a semântica operacional, existem semânticas de etapas grandes, semânticas de etapas pequenas, semânticas baseadas em sistemas de transição rotulados, semânticas baseadas na lógica de reescrita.
Que tipo de abordagem você deve adotar dependerá do tipo de linguagem que seu DSL é, que tipo de experiência você tem com o design da semântica e sua preferência pessoal.
Sem detalhes concretos, não posso ajudar mais.