Pergunta

Eu estou escrevendo alguns excel-like C ++ console app para trabalhos de casa. Meu aplicativo deve ser capaz de aceitar fórmulas para ele é células, por exemplo, ele deve avaliar algo como isto:

Sum(tablename\fieldname[recordnumber], fieldname[recordnumber], ...)

tablename\fieldname[recordnumber] points to a cell in another table, 
fieldname[recordnumber] points to a cell in current table

ou

Sin(fieldname[recordnumber])

ou

anotherfieldname[recordnumber]

ou

"10" // (simply a number)

algo parecido. funções são Sum, Ave, sin, cos, Tan, Berço, Mul, Div, Pow, Log (10), Ln, Mod

É patético, eu sei, mas é a minha lição de casa: '(

Então, alguém sabe um truque para avaliar algo assim?

Foi útil?

Solução

Ok, agradável pergunta lição de casa pelo caminho.

Ela realmente depende de quão pesado você quer que isso seja. Você pode criar um analisador de expressão completa (que é divertido, mas também consome tempo).

Para fazer isso, você precisa para descrever a gramática completa e escrever um frontend (ter um olhar para lex e yacc ou flexx e bisões.

Mas como eu ver a sua pergunta você pode limitar-se a três subcasos:

  • um valor simples
  • uma pesquisa (possivelmente a uma outra tabela)
  • uma função que entradas são pesquisas

Eu acho que um pouco de design OO pode ajuda-lo aqui.

Eu não tenho certeza se você tem que lidar com atualização em tempo real e verificações de dependência circular. Outra coisa que pode ser complicado também.

Outras dicas

Para a análise, eu olhar para recursiva descida de análise. Então, uma tabela que mapeia todos os possíveis nomes de função para função ponteiros:

struct FunctionTableEntry {
    string name;
    double (*f)(double);
};

Você deve escrever um parser. Analisador devem levar a expressão ou seja, cada linha e deve identificar o comando e construir a árvore de análise. Esta é a primeira fase. Na segunda fase você pode avaliar a árvore substituindo os dados para cada um dos elementos do comando.

respondedores anteriores batê-lo na cabeça: você precisa analisar o conteúdo da célula, e interpretá-los .

StackOverflow já tem um montão de perguntas sobre a construção de compiladores e interperters, onde pode encontrar ponteiros para recursos. Alguns deles são:

e assim por diante.

Aparte:. Eu nunca tenho a energia para ligá-los todos juntos, ou mesmo tentar construir uma lista abrangente

Eu acho que você não pode usar yacc / lex (ou similar), de modo que você tem que analisar "manualmente":
Iterar sobre a corda e dividi-lo em suas partes. Que parte é depende de você gramática (sintaxe). Dessa forma, você pode encontrar os nomes de função e os parâmetros. A dificuldade deste depende da complexidade de sua sintaxe.

Talvez você deve ler um pouco sobre lexical análise .

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