L' output è :
['Position.vertex(', 'rotate','(', 'sin','(','0.5', ')', '', '', 'Position.getVertexX()', '', '0.7', '', 'Position.getVertexZ(),')']
Ovio che l' user si puo dimenticare uno spazio prima o dopo una parentesi di conseguenza un lexer un po più serio o segnale o corregge automaticamente questi "errori" .
Invece il complicato è scrivere il parser ma con un po di buona volontà cela puoi fare se ti può servire ti linko i sorgenti di un linguaggio di programmazione interpretato che ho scritto :
https://github.com/UZerbinati/Elyse/wiki
Comunque mettiamo che tu voglia lavorare in C ti suggerirei di scrivere il parser in modo che se incontra tra i token un nome uguale a quello di una funzione da te definita in un header o in una DLL ( in questo modo non devi ricompilare sempre il software ) esegue quella funzione.
Codice sorgente - presumibilmente C++ |
typedef struct Module{ void (*ptf)(char *filebuffer[]); char name[100]; }Module; int load(int ID,char name[20],char function[20]){ Modules[ID].ptf = function; strcpy(Modules[ID].name,name); if (Modules[ID].ptf != NULL){ return 0; } else{ return 1; } } int main () { load(1,"echo",echo); while(1){ if(strcmp(filebuffer[fb_index],Modules[FunctionIndex].name)== 0){ break; } FunctionIndex++; if(FunctionIndex == len(Modules){ FunctionIndex = 0; break; } } ptf = Modules[FunctionIndex].ptf; ptf (); }
|
Poi per essere un attimo puntigliosi più che un interprete mi sembra che tu voglia scrivere un compilatore , poichè vuoi tradurre in un codice nativo.
E per questo devi tenere bene a mente che il parser di un compilatore è molto più difficile da stendere.