Você tem algum motivo eu não poderia criar uma linguagem apoio infix, postfix, e as funções de prefixo, e mais?

StackOverflow https://stackoverflow.com/questions/427040

Pergunta

Eu estive refletindo sobre a criação de uma linguagem que seria extremamente bem adequado para criação de DSLs, permitindo definições de funções que são infix, postfix, prefixo, ou mesmo consistem de várias palavras. Por exemplo, é possível definir um operador multiplicação infixa como se segue (onde se multiplicam (X, Y) já é definida):

a * b => multiply(a,b)

Ou um postfix "quadrado" do operador:

a squared => a * a

Ou um operador C ou Java-style ternário, que envolve duas palavras-chave intercaladas com variáveis:

a ? b : c => if a==true then b else c

É evidente que há muita margem para ambiguidades em tal língua, mas se for tipagem estática (com o tipo de inferência), então a maioria das ambiguidades poderia ser eliminado, e aqueles que permanecem poderia ser considerado um erro de sintaxe (a ser corrigida por acrescentando entre parênteses quando apropriado).

Existe alguma razão que eu não estou vendo que faria isso extremamente difícil, impossível, ou apenas uma má idéia simples?

Editar: Um número de pessoas têm me apontado para idiomas que podem fazer isso ou algo assim, mas eu estou realmente interessado em ponteiros para como eu poderia implementar o meu próprio analisador para isso, ou problemas que pode encontrar se fazê-lo.

Foi útil?

Solução

Isto não é muito difícil de fazer. Você vai querer atribuir a cada operador uma fixidez (infix, prefix, ou postfix) e um precedência . Faça a precedência um número real; você vai me agradecer mais tarde. Operadores de maior prioridade se ligam mais fortemente do que os operadores de baixa prioridade; em níveis iguais de precedência, você pode exigir disambiguation com parênteses, mas você provavelmente vai preferir para permitir que alguns operadores como associativo assim você pode escrever

x + y + z

sem parênteses. Uma vez que você tem uma fixidez, uma precedência, e um associatividade para cada operador, você vai querer escrever um operador precedência parser . Este tipo de processador é razoavelmente simples para escrever; ele verifica símbolos da esquerda para a direita e utiliza uma pilha auxiliar. Há uma explicação no livro Dragão, mas eu nunca achei muito clara, em parte porque o livro dragão descreve um caso muito geral de análise operadora de precedência. Mas eu não acho que você vai encontrá-lo difícil.

Outro caso que você vai querer ter cuidado é quando você tem

prefix (e) postfix

onde prefix e postfix têm a mesma precedência. Este caso também requer parênteses para a desambiguação.

O meu papel Unparsing Expressões com Prefixo e Postfix Operadores tem um analisador de exemplo na parte de trás, e você pode baixar o código, mas é escrito em ML, então seu funcionamento pode não ser óbvio para o amador. Mas todo o negócio de fixidez e assim por diante é explicado em grande detalhe.

Outras dicas

O que você vai fazer sobre a ordem das operações?

a * b squared

Você pode querer verificar para fora Scala, que tem um tipo de abordagem única para os operadores e métodos.

Haskell tem apenas o que você está procurando.

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