Girovagando sul web (https://www.sblendorio.eu/Misc/Sillabe) ho trovato questo vecchio listato (1983!) in Basic per Commodore 64. Ricordo che funzionava benissimo, tant'è vero che lo ripresi e lo implementai in Visual Basic nel 1998(!!).
A causa della mia pigrizia - e dato che anche Visual Basic consentiva la numerazione delle righe(!) - lo adattai con minime modifiche (aggiungendo però una quantità incredibile di funzioni, vedi screenshot).
Ho fatto un giro sul web ma non ho trovato algoritmi in Delphi / Lazarus.
Con Lazarus sono ancora agli inizi e non me la sento di fare la "conversione".
Qualcuno se la sente di dedicare tempo e pazienza? La routine è molto breve:
210 S = 1: R$ = "" : PRINT
220 INPUT "VOCABOLO ";B$ : IF B$ = "0" OR B$ = "" THEN END
230 GOSUB 500
240 IF S > LEN(A$) THEN R$=MID$(R$,1,LEN(R$)-1) : PRINT R$: GOTO 210
250 X$ = MID$(A$, S, 1): GOSUB 460
260 IF A = 0 THEN 430
270 X$ = MID$(A$, S + 1, 1): GOSUB 460
280 IF A = 0 THEN 360
290 IF X$ = "I" THEN 320
300 IF MID$(A$, S, 1) = "I" OR MID$(A$, S, 1) = "U" THEN 430
310 GOTO 440
320 X$ = MID$(A$, S + 2, 1): GOSUB 460
330 IF S > 1 THEN IF MID$(A$, S - 1, 2) = "QU" AND A <> 0 THEN R$=R$+MID$(B$, S, 2) : S = S + 2: GOTO 240
340 IF A <> 0 THEN 440
350 GOTO 430
360 IF S + 2 > LEN(A$) THEN 450
370 X$ = MID$(A$, S + 2, 1): GOSUB 460
380 IF A <> 0 THEN 440
390 IF MID$(A$, S + 1, 1) = MID$(A$, S + 2, 1) THEN 450
400 A1$ = MID$(A$, S + 1, 1): IF A1$ = "S" OR A1$ = "G" THEN 440
410 A2$ = MID$(A$, S + 2, 1): IF A2$ = "R" OR A2$ = "L" OR A2$ = "H" THEN 440
420 GOTO 450
430 R$=R$+MID$(B$, S, 1) : S = S + 1: GOTO 240
440 R$=R$+MID$(B$, S, 1) + "-" : S = S + 1: GOTO 240
450 R$=R$+MID$(B$, S, 2) + "-" : S = S + 2: GOTO 240
460 A = (X$ = "A") OR (X$ = "E") OR (X$ = "I") OR (X$ = "O") OR (X$ = "U"): RETURN
490 REM -- IMPLEMENTAZIONE DI UPPERCASE --
500 A$ = ""
510 FOR I = 1 TO LEN(B$)
520 C = ASC(MID$(B$, I, 1))
530 IF C >= 97 AND C <= 122 THEN C = C - 32
540 A$ = A$ + CHR$(C)
550 NEXT
560 RETURN
Se può esservi utile, questo invece è l'adattamento che io feci in Visual Basic:
Function Divide_Parola(A$)
Dim Indice%, Parola$, Flag%, Buffer$, Buf_1$, Buf_2$, Txt$
' Divisone in sillabe (versione universale)
Parola$ = LCase$(A$): Buffer$ = ""
Buf_1$ = ""
Indice% = 1
'35 If Indice% > Len(Parola$) Then Text2.Text = Txt$: Call Separa(Txt$): Exit Function
35 If Indice% > Len(Parola$) Then Divide_Parola = Txt$: Exit Function
Buffer$ = Mid$(Parola$, Indice%, 1): GoSub 300
If Flag% = 0 Then GoTo 250
Buffer$ = Mid$(Parola$, Indice% + 1, 1): GoSub 300
If Flag% = 0 Then GoTo 150
If Buffer$ = "i" Then GoTo 120
If Mid$(Parola$, Indice%, 1) = "i" Or Mid$(Parola$, Indice%, 1) = "u" Then GoTo 250
GoTo 260
120 Buffer$ = Mid$(Parola$, Indice% + 2, 1): GoSub 300
If Indice% > 1 Then If Mid$(Parola$, Indice% - 1, 2) = "qu" And Flag% = -1 Then Txt$ = Txt$ & Mid$(Parola$, Indice%, 2): Indice% = Indice% + 2: GoTo 35
If Flag% = -1 Then GoTo 260
GoTo 250
150 If Indice% + 2 > Len(Parola$) Then GoTo 270
Buffer$ = Mid$(Parola$, Indice% + 2, 1): GoSub 300
If Flag% = -1 Then GoTo 260
If Mid$(Parola$, Indice% + 1, 1) = Mid$(Parola$, Indice% + 2, 1) Then GoTo 270
Buf_1$ = Mid$(Parola$, Indice% + 1, 1): If Buf_1$ = "s" Or Buf_1$ = "g" Then GoTo 260
Buf_2$ = Mid$(Parola$, Indice% + 2, 1): If Buf_2$ = "r" Or Buf_2$ = "l" Or Buf_2$ = "h" Then GoTo 260
GoTo 270
250 Txt$ = Txt$ & Mid$(Parola$, Indice%, 1): Indice% = Indice% + 1: GoTo 35
260 Txt$ = Txt$ & Mid$(Parola$, Indice%, 1) & "-": Indice% = Indice% + 1: GoTo 35
270 Txt$ = Txt$ & Mid$(Parola$, Indice%, 2) & "-": Indice% = Indice% + 2: GoTo 35
300 Flag% = Buffer$ = "a" Or Buffer$ = "e" Or Buffer$ = "i" Or Buffer$ = "o" Or Buffer$ = "u": Return
End Function
EDIT: effettivamente ciò che avevo allegato non funziona con tutto. Provato con parole chiavi delle TRECCANI e su alcune sbagliava.
Progetto ritirato :(
Questo è ciò che vuoi.
//Non devi istanziare nulla, classi o altro, basta inserire la unita indicata nella uses e chiamare la funzione indicata.
// inserisci nelle Uses
Uses USillabazione;
//per usarlo
//stringasillabata := TSillabazione.Sillaba(stringadasillabare)
//Esempio
ShowMessage(TSillabazione.Sillaba(Trim(Edit1.Text)));
Ciao
Progetto completato e funzionante anche con caratteri accentati (unicode) in Delphi.
A causa dello scarso supporto ai caratteri Unicode in Lazarus (è più laborioso gestirli) il codice funziona per adesso solo con caratteri non accentati.
Il codice, nonostante sia abbastanza preciso non risolve tutte le situazioni di sillabazione (in particolare si vedano le parole sorpresa, tungsteno, transatlantico).
// Il progetto fornito è funzionante.
//Se si vuole usare la funzioinalità in altri progetti,
//inserire nelle Uses del proprio progetto AVENDO CURA DI COPIARE NELLA CARTELLA DEL PROPRIO PROGETTO L'UNITA !!!!!
Uses USillabazione;
//per usarlo
//stringasillabata := TSillabazione.Sillaba(stringadasillabare)
//Esempio
ShowMessage(TSillabazione.Sillaba(Trim(Edit1.Text)));