2009-12-22 7 views
7

ho voluto sperimentare con il Shakespeare programming language, così ho scaricato da here ed eseguito il Makefile utilizzando cd spl-1.2.1Make.compilazione e l'esecuzione del linguaggio di programmazione Shakespeare traduttore spl2c su Mac OS X 10.6 risultati in avvisi/errori

La compilazione di spl2c esegue con un paio di avvertenze:

scanner.l:600: warning, rule cannot be matched 
<stdout>:5808: warning: ‘yyunput’ defined but not used 

E poi, quando si tenta di compilare tutti gli esempi tutto va in tilt:

../spl/bin/spl2c <fibonacci.spl> fibonacci.c 
Warning at line 19: equality expected 
Warning at line 28: equality expected 
Warning at line 30: comment expected 
Warning at line 30: comment expected 
Warning at line 30: comment expected 
Warning at line 30: comment expected 
Warning at line 32: comment expected 
Warning at line 32: comment expected 
Warning at line 32: comment expected 
Warning at line 32: comment expected 
Warning at line 34: comment expected 
Warning at line 34: comment expected 
Warning at line 34: comment expected 
Warning at line 34: comment expected 
Warning at line 36: comment expected 
Warning at line 36: comment expected 
Warning at line 37: comment expected 
Warning at line 37: comment expected 
Warning at line 37: comment expected 
Warning at line 37: colon expected 
Warning at line 40: equality expected 
Warning at line 51: comment expected 
Warning at line 51: comment expected 
Warning at line 51: comment expected 
Warning at line 51: comment expected 
Warning at line 51: comment expected 
Warning at line 51: colon expected 
Error at line 59: 'act [roman number]' or 'scene [roman number]' expected 
1 errors and 27 warnings found. No code output. 

Qualcuno mi può puntare nella giusta direzione per risolvere questo? Il mio progetto originale sarebbe stato imparare a spl, non ad appoggiare i compilatori di debug (mi piacerebbe davvero scrivere il mio compilatore alla fine, ma per ora preferirei mantenere il mio progetto iniziale).

Sono in esecuzione OS X 10.6.2, gcc version 4.2.1 (Apple Inc. build 5646) (dot 1), flex 2.5.35 e bison (GNU Bison) 2.3.

EDIT: Per i programmi semplici che non richiedono goto (ad es hello.spl) si può aggirare il problema eliminando tutte le linee di ACT/SCENE tranne il primo atto di I/SCENA I.

risposta

22

Questo è un difetto in un'espressione regolare nel parser lessicale.

I forked the language.

I fixed the issue.

I notified the original authors.

Here's a release of the language that includes the fix for your enjoyment.

There are still a few warnings, ma non sembrano influenzare nulla. Let me know se trovi altri problemi funzionali e vedrò cosa posso fare con loro.

(Roffel - questo sarebbe necromanzia, se non fosse per il fatto che nessuno si preoccupa di questo problema.)

+0

Ditto-et. Grazie Kyle. Marlowe è stato incorporato in OpenCOBOL, COBILL. –

+0

Parlando di negromanzia: in realtà, la diagnosi presentata qui non è corretta. L'espressione regolare originale funzionerebbe così come la sostituzione suggerita. Tuttavia, c'è stato un bug in flessione per circa un decennio che ha comportato l'uso di ripetizioni rinforzate con argomenti insensibili alle maiuscole e minuscole. L'ho segnalato su https://github.com/westes/flex/issues/193 – rici

1

Il primo problema con scanner.l:600: warning, rule cannot be matched è poiché la parola rotten è stata aggiunta due volte al file include/negative_adjective.wordlist basta rimuoverla da lì e il primo avviso verrà rimosso. Questo non risolve il resto però. Dai un'occhiata qui se posso aggiustare qualcosa di più.

+0

Hanno guardato un po 'ora. Lo scanner sembra mischiare numeri romani per "scene" e "atti". Sembrava di riscrivere la grammatica per avere parti separate ma poi si mescolava con il token "I" in prima persona. Beh, direi che qualcosa dipende dallo scanner e dalla grammatica che hanno usato per creare questa cosa ... sarebbe stato divertente vederlo funzionare :) – epatel

+0

"scanner e grammatica" - intendo la versione bisonte e flex – epatel

+0

Bene, è un buon inizio Quando avrò tempo potrei provare a dare un'occhiata anche a questo. O forse entrerà qualche altra anima utile e la prenderà in mano. Sono d'accordo che sarebbe divertente vedere lavorare. –

3

Questo problema deriva da un bug in Flex introdotto da qualche parte tra le versioni 2.5.4 e 2.5.33; cioè, tra il momento in cui è stato scritto il processore di Shakespeare e questa domanda è stata posta. L'errore riguarda l'uso dell'operatore di ripetizione controventato con argomenti a carattere singolo in un'espressione regolare insensibile alle maiuscole e minuscole (ad esempio i{1,3}, che fa parte della specifica di Shakespeare flex per i numeri romani); la conseguenza del bug è che l'insensibilità alle maiuscole e minuscole viene persa, pertanto lo i{1,3} viene espanso come se fosse [iI]i?i? anziché [iI][iI]?[iI]?. Ciò significa che i numeri romani maiuscoli con caratteri ripetuti (che è normale nel codice sorgente di Shakespeare) non verranno identificati correttamente.

La modifica di Kyle Cartmell in Marlowe utilizza lettere maiuscole nella regex anziché in lettere minuscole, che inverte il problema in modo che solo i numeri romani maiuscoli funzionino in modo affidabile.

Ho segnalato il bug di Flex come https://github.com/westes/flex/issues/193. È una patch su una linea per Flex se qualcuno ne ha bisogno prima della versione ufficiale.