Sono interessato ad estendere la mia conoscenza della programmazione per computer implementando un linguaggio di programmazione basato su stack. Sto cercando un consiglio su dove iniziare, poiché ho intenzione di avere funzioni come "pushint 1
" che spingono un intero con valore 1 in cima allo stack e controllo del flusso tramite etichette come "L01: jump L01:
".Come implementare un linguaggio di programmazione semplice basato su stack
Finora ho implementato un C# di ciò che voglio che il mio linguaggio agisca come (volevo collegarlo ma IDEOne è bloccato), ma è molto caotico e necessita di ottimizzazione. Traduce l'input in XML e poi lo analizza. I miei obiettivi sono di passare ad un linguaggio di livello inferiore, (forse C/C++) ma i miei problemi stanno implementando uno stack che può contenere vari tipi di dati e non ha una dimensione fissa.
Eventualmente vorrei anche implementare matrici e funzioni. Inoltre, penso di aver bisogno di un Lexer migliore e mi chiedo se un parsing tree sarebbe una buona idea per un linguaggio così semplicistico.
Qualsiasi consiglio/critica è il benvenuto, e per favore considera che sono ancora abbastanza nuovo per la programmazione (ho appena completato AP CompSci I). Inoltre, i collegamenti ai linguaggi basati su stack open source sono i benvenuti.
Ecco un programma di base che mi piacerebbe provare e interpretare/compilazione (dove [this is a comment]
):
[Hello World!]
pushchar '\n'
pushstring "Hello World!"
print
[Count to 5 and then count down!]
pushint 1
setlocal 0
L01:
pushchar '\n'
getlocal 0
print [print x + '\n']
getlocal 0
increment
setlocal 0 [x = x + 1]
pushint 5
getlocal 0
lessthan [x < 5]
iftrue L01
L02:
pushchar '\n'
getlocal 0
print [print x + '\n']
getlocal 0
decrement
setlocal 0 [x = x - 1]
pushint 0
getlocal 0
greaterthan [x > 0]
iftrue L02
Il risultato atteso sarebbe:
Hello World!
1
2
3
4
5
4
3
2
1
Per coincidenza, la sintassi del tuo nuovo linguaggio di programmazione è molto simile al [tag: REBOL] programmazione della sintassi del linguaggio. –
@AndersonGreen questa sintassi era in realtà basata sugli opcode di Adobe ActionScript Virtual Machine 2 (AVM2). Rebol sembra interessante però! – Wingpad