Semplice convertitore di codifica tra ELEA e il Formato di Transizione Unicode a 8-bit

This commit is contained in:
Antonio Malara 2019-12-25 19:07:48 +01:00
parent fdb31afeb4
commit 22dae62ee7
9 changed files with 174 additions and 76 deletions

View file

@ -1,8 +1,25 @@
CC=gcc
CFLAGS=-g
LDFLAGS=-g
elea: elea.o governo.o accumulatore.o memoria.o ricerca.o algebra.o telescrivente.o
elea: \
elea.o \
governo.o \
accumulatore.o \
memoria.o \
ricerca.o \
algebra.o \
telescrivente.o \
hello_world.o \
long_division.o
hello_world.c: hello_world.elea-txt caratteri.py
python caratteri.py $<
long_division.c: long_division.elea-txt caratteri.py
python caratteri.py $<
clean: FORCE
@rm -f elea *.o tags
@rm -f elea *.o tags hello_world.c long_division.c
.PHONY: FORCE

View file

@ -1,77 +1,18 @@
# coding=utf8
import sys
from pprint import pprint
caratteri = [
('0', 'CAR_ZERO'),
('1', 'CAR_UNO'),
('~', 'CAR_ONDA'),
('2', 'CAR_DUE'),
('4', 'CAR_QUATTRO'),
('+', 'CAR_PIU'),
('#', 'CAR_DIESIS'),
('3', 'CAR_TRE'),
('5', 'CAR_CINQUE'),
('6', 'CAR_SEI'),
('/', 'CAR_BARRA'),
('-', 'CAR_MENO'),
('7', 'CAR_SETTE'),
('9', 'CAR_NOVE'),
('÷', 'CAR_DIVISO'),
('8', 'CAR_OTTO'),
('Φ', 'CAR_PHI'),
('A', 'CAR_A'),
('δ', 'CAR_DELTA'),
('B', 'CAR_B'),
('D', 'CAR_D'),
('=', 'CAR_UGUALE'),
('α', 'CAR_ALFA'),
('C', 'CAR_C'),
('E', 'CAR_E'),
('F', 'CAR_F'),
('%', 'CAR_PERCENTO'),
(',', 'CAR_VIRGOLA'),
('G', 'CAR_G'),
('I', 'CAR_I'),
('γ', 'CAR_GAMMA'),
('H', 'CAR_H'),
('.', 'CAR_PUNTO'),
('S', 'CAR_S'),
('θ', 'CAR_TETA'),
('T', 'CAR_T'),
('V', 'CAR_V'),
('!', 'CAR_ESCLAMATIVO'),
(')', 'CAR_CHIUSA_PARENTESI'),
('U', 'CAR_U'),
('W', 'CAR_W'),
('X', 'CAR_X'),
('?', 'CAR_INTERROGATIVO'),
('&', 'CAR_E_COMMERCIALE'),
('Y', 'CAR_Y'),
("'", 'CAR_APOSTROFO'),
('', 'CAR_MOLTIPLICATO_PER'),
('Z', 'CAR_Z'),
('ε', 'CAR_EPSILON'),
('J', 'CAR_J'),
('*', 'CAR_ASTERISCO'),
('K', 'CAR_K'),
('M', 'CAR_M'),
('(', 'CAR_APERTA_PARENTESI'),
('β', 'CAR_BETA'),
('L', 'CAR_L'),
('N', 'CAR_N'),
('O', 'CAR_O'),
('$', 'CAR_DOLLARO'),
('P', 'CAR_P'),
('η', 'CAR_ETA'),
('R', 'CAR_R'),
('π', 'CAR_PI'),
('Q', 'CAR_Q'),
mappa_caratteri = [
"0", "1", "~", "2", "4", "+", "#", "3", "5", "6", "/", "7", "9", "-", "÷", "8",
"Φ", "A", "δ", "B", "D", "=", "α", "C", "E", "F", "%", "G", "I", ",", "γ", "H",
".", "S", "θ", "T", "V", "!", ")", "U", "W", "X", "?", "Y", "\'", "&", "", "Z",
"ε", "J", "*", "K", "M", "(", "β", "L", "N", "O", "$", "η", "R", "P", "π", "Q"
]
caratteri_python_a_elea = {
caratteri[i][0].decode('utf-8'): caratteri[i] + (i,)
for i in xrange(len(caratteri)) }
char.decode('utf-8'): idx
for idx, char in enumerate(mappa_caratteri) }
def stringa_python_a_elea(string):
s = []
@ -82,18 +23,58 @@ def stringa_python_a_elea(string):
xx = caratteri_python_a_elea.get(i, None)
if xx is None:
print "NO", repr(i)
continue
raise Exception("carattere %s non mappato" % i)
s.append(xx)
return s
hello_world = """
11 017 # Φ
0X XXX # 0
HELLO.WORLD
def elea_a_c(l):
l2 = ('%3d,' % i for i in l)
return ' ' + ' '.join(l2)
def stringa_elea_a_c(l):
e = stringa_python_a_elea(l)
e2 = elea_a_c(e)
return e2 + " /* " + l + " */"
PROLOGO = """#include "elea_tipi.h"
const carattere %s[] = {
"""
pprint(stringa_python_a_elea(hello_world))
EPILOGO = """};
const int %s_lunghezza = sizeof(%s) / sizeof(carattere);
"""
def txt_to_c(stringa_txt, nome):
x = []
x += (PROLOGO % nome).splitlines()
for line in stringa_txt.splitlines():
l2 = line.strip()
if len(l2) == 0: continue
x.append(stringa_elea_a_c(l2))
x += (EPILOGO % (nome, nome)).splitlines()
return '\n'.join(x)
def converti(nomefile):
nome = nomefile.split('.', 1)[0]
x = open(nomefile).read()
c = txt_to_c(x, nome)
open('%s.c' % nome, 'w').write(c)
if __name__ == '__main__':
try:
nomefile = sys.argv[1]
except:
print "converte da txt in elea -> file c\n"
print "usaggio: %s nomefile.txt"
sys.exit()
converti(nomefile)

10
elea.c
View file

@ -4,6 +4,12 @@
#include "memoria.h"
#include "codifica_istruzioni.h"
extern const carattere hello_world[];
extern const int hello_world_lunghezza;
extern const carattere long_division[];
extern const int long_division_lunghezza;
/* main */
int main(int argc, char *argv[])
{
@ -39,5 +45,9 @@ int main(int argc, char *argv[])
/* Esegue l'istruzione phi */
op_ms(&istr);
mem_scrivi_blocco(1, hello_world, hello_world_lunghezza);
mem_scrivi_blocco(100, long_division, long_division_lunghezza);
return 0;
}

9
hello_world.c Normal file
View file

@ -0,0 +1,9 @@
#include "elea_tipi.h"
const carattere hello_world[] = {
1, 1, 0, 0, 1, 11, 6, 16, /* 11 0017 # Φ */
0, 41, 41, 41, 41, 41, 6, 0, /* 0X XXXX # 0 */
31, 24, 55, 55, 57, 40, 57, 60, 55, 20, /* HELLO WORLD */
};
const int hello_world_lunghezza = sizeof(hello_world) / sizeof(carattere);

4
hello_world.elea-txt Normal file
View file

@ -0,0 +1,4 @@
11 0017 # Φ
0X XXXX # 0
HELLO WORLD

37
long_division.c Normal file
View file

@ -0,0 +1,37 @@
#include "elea_tipi.h"
const carattere long_division[] = {
0, 0, 0, 0, 0, 0, 0, 0, /* 00 0000 0 0 */
0, 0, 0, 0, 0, 0, 0, 0, /* 00 0000 0 0 */
0, 0, 0, 0, 0, 0, 1, 58, /* 00 0000 1 $ */
0, 0, 0, 0, 0, 0, 0, 0, /* 00 0000 0 0 */
0, 0, 0, 0, 0, 0, 0, 0, /* 00 0000 0 0 */
0, 0, 0, 0, 0, 0, 0, 0, /* 00 0000 0 0 */
0, 0, 0, 0, 0, 0, 0, 0, /* 00 0000 0 0 */
0, 0, 0, 0, 0, 0, 6, 17, /* 00 0000 # A */
1, 4, 0, 1, 9, 0, 6, 25, /* 14 0160 # F */
0, 1, 0, 3, 3, 9, 6, 18, /* 01 0226 # δ */
3, 3, 0, 1, 4, 9, 6, 25, /* 22 0146 # F */
0, 1, 0, 3, 1, 15, 6, 18, /* 01 0218 # δ */
3, 3, 6, 6, 6, 6, 6, 14, /* 22 #### # ÷ */
0, 0, 0, 1, 4, 9, 6, 1, /* 00 0146 # 1 */
14, 14, 0, 0, 13, 13, 0, 12, /* ÷÷ 00-- 0 9 */
14, 14, 0, 0, 13, 13, 0, 4, /* ÷÷ 00-- 0 4 */
14, 14, 0, 1, 4, 9, 16, 12, /* ÷÷ 0146 Φ 9 */
4, 0, 0, 3, 8, 0, 6, 43, /* 40 0250 # Y */
14, 14, 13, 13, 13, 13, 16, 4, /* ÷÷ ---- Φ 4 */
6, 6, 0, 1, 4, 9, 16, 8, /* ## 0146 Φ 5 */
35, 6, 0, 0, 1, 8, 32, 0, /* T# 0015 . 0 */
6, 6, 6, 6, 0, 0, 0, 17, /* ## ##00 0 A */
1, 4, 0, 1, 9, 0, 6, 31, /* 14 0160 # H */
40, 6, 0, 7, 3, 4, 6, 0, /* W# 0324 # 0 */
58, 61, 0, 1, 3, 7, 6, 14, /* $P 0123 # ÷ */
0, 0, 0, 0, 0, 0, 16, 7, /* 00 0000 Φ 3 */
38, 6, 0, 3, 15, 4, 6, 0, /* )# 0284 # 0 */
1, 4, 0, 1, 9, 0, 6, 23, /* 14 0160 # C */
14, 14, 0, 0, 0, 1, 0, 4, /* ÷÷ 0001 0 4 */
14, 14, 0, 0, 0, 1, 16, 5, /* ÷÷ 0001 Φ + */
38, 6, 0, 1, 9, 0, 6, 0, /* )# 0160 # 0 */
};
const int long_division_lunghezza = sizeof(long_division) / sizeof(carattere);

32
long_division.elea-txt Normal file
View file

@ -0,0 +1,32 @@
00 0000 0 0
00 0000 0 0
00 0000 1 $
00 0000 0 0
00 0000 0 0
00 0000 0 0
00 0000 0 0
00 0000 # A
14 0160 # F
01 0226 # δ
22 0146 # F
01 0218 # δ
22 #### # ÷
00 0146 # 1
÷÷ 00-- 0 9
÷÷ 00-- 0 4
÷÷ 0146 Φ 9
40 0250 # Y
÷÷ ---- Φ 4
## 0146 Φ 5
T# 0015 . 0
## ##00 0 A
14 0160 # H
W# 0324 # 0
$P 0123 # ÷
00 0000 Φ 3
)# 0284 # 0
14 0160 # C
÷÷ 0001 0 4
÷÷ 0001 Φ +
)# 0160 # 0

View file

@ -39,3 +39,10 @@ void mem_scrivi_carattere(uint32_t ind, carattere c)
{
M[ind] = c;
}
void mem_scrivi_blocco(uint32_t ind, const carattere * blocco, int lunghezza)
{
for (int i = 0; i < lunghezza; i++)
mem_scrivi_carattere(ind + i, blocco[i]);
}

View file

@ -10,5 +10,6 @@ int op_meno_mm(istruzione *i);
/* Accesso diretto alla memoria */
carattere mem_leggi_carattere(uint32_t ind);
void mem_scrivi_carattere(uint32_t ind, carattere c);
void mem_scrivi_blocco(uint32_t ind, const carattere * blocco, int lunghezza);
#endif