Repository navigation
Expand file tree
/
Copy pathsimples
More file actions
executable file
·206 lines (178 loc) · 5.59 KB
/
Copy pathsimples
File metadata and controls
executable file
·206 lines (178 loc) · 5.59 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
#!/bin/bash
# ============================================================
# Script Wrapper - Compilador Linguagem Simples
# UNIFAL - Universidade Federal de Alfenas
# ============================================================
#
# Uso: ./simples <programa>
#
# Este script automatiza o processo de compilação e execução
# de programas escritos na Linguagem Simples.
#
# Exemplo:
# ./simples tests/dobro
# ./simples fatorial
# ============================================================
# Cores para output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Diretórios
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
BUILD_DIR="$SCRIPT_DIR/build"
TESTS_DIR="$SCRIPT_DIR/tests"
COMPILADOR="$BUILD_DIR/compilador"
MVS="$BUILD_DIR/mvs"
# Função de ajuda
show_help() {
echo -e "${BLUE}============================================================${NC}"
echo -e "${BLUE} Compilador Linguagem Simples - UNIFAL${NC}"
echo -e "${BLUE}============================================================${NC}"
echo ""
echo "Uso: ./simples [opções] <programa>"
echo ""
echo "Opções:"
echo " -ast Gera apenas a árvore sintática (.dot)"
echo " -mvs Gera apenas o código MVS (.mvs)"
echo " -h, --help Mostra esta mensagem"
echo ""
echo "Exemplos:"
echo " ./simples tests/dobro # Compila e executa"
echo " ./simples -ast fatorial # Apenas gera AST"
echo " ./simples -mvs maior # Apenas gera MVS"
echo ""
}
# Função para verificar se o compilador foi construído
check_compiler() {
if [ ! -f "$COMPILADOR" ] || [ ! -f "$MVS" ]; then
echo -e "${YELLOW}⚠ Compilador não encontrado. Compilando...${NC}"
cd "$SCRIPT_DIR"
make all > /dev/null 2>&1
if [ $? -ne 0 ]; then
echo -e "${RED}✗ Erro ao compilar o projeto!${NC}"
echo -e "${YELLOW}Execute 'make all' manualmente para ver os erros.${NC}"
exit 1
fi
echo -e "${GREEN}✓ Compilador construído com sucesso!${NC}"
echo ""
fi
}
# Função para normalizar o caminho do arquivo
normalize_path() {
local input="$1"
# Remove extensão .simples se existir
input="${input%.simples}"
# Se o arquivo não existe no caminho especificado, tenta em tests/
if [ ! -f "${input}.simples" ]; then
if [ -f "$TESTS_DIR/${input##*/}.simples" ]; then
echo "$TESTS_DIR/${input##*/}"
return
fi
fi
echo "$input"
}
# Processa argumentos
MODE="full"
PROGRAMA=""
while [[ $# -gt 0 ]]; do
case $1 in
-ast)
MODE="ast"
shift
;;
-mvs)
MODE="mvs"
shift
;;
-h|--help)
show_help
exit 0
;;
*)
PROGRAMA="$1"
shift
;;
esac
done
# Verifica se o programa foi especificado
if [ -z "$PROGRAMA" ]; then
echo -e "${RED}✗ Erro: Nenhum programa especificado!${NC}"
echo ""
show_help
exit 1
fi
# Normaliza o caminho do programa
PROGRAMA=$(normalize_path "$PROGRAMA")
# Verifica se o arquivo existe
if [ ! -f "${PROGRAMA}.simples" ]; then
echo -e "${RED}✗ Erro: Arquivo não encontrado: ${PROGRAMA}.simples${NC}"
exit 1
fi
# Verifica se o compilador está construído
check_compiler
# Nome base do arquivo (sem diretório e extensão)
BASENAME=$(basename "$PROGRAMA")
echo -e "${BLUE}============================================================${NC}"
echo -e "${BLUE} Processando: ${BASENAME}.simples${NC}"
echo -e "${BLUE}============================================================${NC}"
echo ""
# Modo AST apenas
if [ "$MODE" = "ast" ]; then
echo -e "${YELLOW}[1/1] Gerando árvore sintática...${NC}"
$COMPILADOR -ast "$PROGRAMA"
if [ $? -eq 0 ]; then
echo ""
echo -e "${GREEN}✓ Árvore sintática gerada: ${PROGRAMA}.dot${NC}"
# Tenta gerar PNG se graphviz estiver instalado
if command -v dot &> /dev/null; then
echo -e "${YELLOW}[+] Gerando visualização PNG...${NC}"
dot -Tpng "${PROGRAMA}.dot" -o "${PROGRAMA}.png"
if [ $? -eq 0 ]; then
echo -e "${GREEN}✓ Imagem gerada: ${PROGRAMA}.png${NC}"
fi
fi
else
echo -e "${RED}✗ Erro na análise sintática!${NC}"
exit 1
fi
exit 0
fi
# Modo MVS apenas
if [ "$MODE" = "mvs" ]; then
echo -e "${YELLOW}[1/1] Gerando código MVS...${NC}"
$COMPILADOR "$PROGRAMA"
if [ $? -eq 0 ]; then
echo ""
echo -e "${GREEN}✓ Código MVS gerado: ${PROGRAMA}.mvs${NC}"
echo -e "${BLUE}Execute com: $MVS $PROGRAMA${NC}"
else
echo -e "${RED}✗ Erro na geração de código!${NC}"
exit 1
fi
exit 0
fi
# Modo completo (compilar e executar)
echo -e "${YELLOW}[1/2] Compilando programa...${NC}"
$COMPILADOR "$PROGRAMA" > /dev/null 2>&1
if [ $? -ne 0 ]; then
echo -e "${RED}✗ Erro na compilação!${NC}"
$COMPILADOR "$PROGRAMA"
exit 1
fi
echo -e "${GREEN}✓ Compilação concluída!${NC}"
echo ""
echo -e "${YELLOW}[2/2] Executando programa...${NC}"
echo -e "${BLUE}------------------------------------------------------------${NC}"
$MVS "$PROGRAMA"
EXIT_CODE=$?
echo -e "${BLUE}------------------------------------------------------------${NC}"
if [ $EXIT_CODE -eq 0 ]; then
echo ""
echo -e "${GREEN}✓ Execução concluída com sucesso!${NC}"
else
echo ""
echo -e "${RED}✗ Erro na execução! (código: $EXIT_CODE)${NC}"
fi
exit $EXIT_CODE