28/10/99 Segundo Trabalho de LP Linguagem C++ Prof. Flávio Miguel Varejão ProLis ("Programação com Listas") é uma linguagem de programação especialmente criada para este trabalho. ProLis é inspirada em LISP e, como consequência, possui muitas das características desta linguagem. Por outro lado, ProLis é uma linguagem mais simples e menos expressiva que LISP. ProLis possui um conjunto pequeno e restrito de tipos de dados, organizados numa hierarquia, como mostra a figura abaixo: Base Lógico Símbolo Átomo Lista String Número Apresenta-se, a seguir, uma especificação mais detalhada dos tipos usados na construção de programas em ProLis: 1. Lógico Valores: v ou f Operações: e ou nao se 2. Símbolo Valores: nomes de operações dos outros tipos Exemplos de Valores: e primeiro resto se nao 3. String Valores: conjunto de cadeias de caracteres delimitados por "" Exemplos de Valores: "Flavio" "adicao" "char" "323" "3det 5" Exemplos de Operações: <> == 4. Número Valores: intervalo do conjunto dos números reais Exemplos de Valores: 2 3 12.34 77 8.82 Operações: / < <= > >= = <> 5. Lista Valores: listas de valores do tipo base Exemplos de Valores: nil ( ) (2 3 5) (2 3.2 "Flavio") (2 (3 4 5) (7 8)) (* 2 3) Exemplos de Operações: primeiro resto vazia insereInic insereFim == <> A sintaxe das expressões em ProLis é equivalente a de LISP, tendo por base o uso de parênteses e a notação pré-fixada. Alguns exemplos de expressões ProLis são mostradas a seguir: 3 3.2 "Aline" ( (3 4 5) nil (1 2.1) ) v ( 3 2) ( 1 2 3 4 5) ("noite" "lua" "dia" "sol") (== (< ( 2 3 4) 10) "lua") Crie em C++ uma hierarquia de classes que implemente os tipos de dados de ProLis. Utilize esta hierarquia para implementar um avaliador de expressões de ProLis. Seguemse exemplos de uso deste interpretador: ? ( 3 2) 5 ? ( < 1 2.3 ) v ? (3 2) (3 2) ? (e v v) v ? (3 ( 2 2) "Flavio") (3 4 "Flavio") ? (e v f) f ? ( "Flavio " "Miguel") "Flavio Miguel" ? ( 2 "nd") "2nd" ? (se (< ( 3 2) ( 3 2) ) nil (3 4 5)) (3 4 5) ? ( "trab" 2) "trab2" ? (primeiro (1 2 3 4 5) ) 1 ? ( "insere" "Fim") insereFim ? (resto (1 2 3 4 5) ) (2 3 4 5) ? ( (( "insere" "Inic") ("Flavio" 5) 3) (7 8 (9 10) ) ("Flavio" 5 3 7 8 (9 10) ) ? (concatena (1 2) (3 4)) (1 2 3 4) ?() nil ? ( 2 1.5) 3.0 ? ( 3 "Flavio" (< (+ 5 2) 8) (primeiro (7 6 5) ) ) (3 "Flavio" f 7) ? ( ( "insere" (se (> 2 3) "Inic" "Fim") 0 (1 2 3 ) ) (1 2 3 0)