Me ha gustado lo de la iniciación por "caritas" +1
Noté que usas ";" para fin de linea osea lo usas para saber cuando a acabado la declaracion de la expresión, eso siempre ha sido mi punto debil he de admitir por lo que sería genial que añadieras otra forma de finalizar la expresion tal como un "[Intro]" o un "." se parece demasiado al C.
Se puede, claro, hay que checarlo con detenimiento, por ejemplo, si quisieramos terminar la expresión o sentencia con un '.' podría haber algo así:
1+2.
Pero el intérprete se confundiría ya que puede ser un número decimal o no, cuestiones como esas son las que te topas al programar algo así, aunque pudiera utilizarse otro caracter para fin de sentencia, sólo habría que verificar que no se usara en ninguna otra parte o entrara en conflicto con otras cosas.
la forma de declarar las variables :variable: es vastante novedosa +2 :esto es una variable:
genial!, aunq como concatenarias tu dos variables?
:var1: = 'hola ';
:var2: = 'mundo!';
printn(:var1: + :var2:);
printn(:var1: . :var2:);
printn(:var1::var2:);
var2 = 'Esto es una variable?';
Eso lo intenté, el realizar algo así:
print("hola! ", : variable :, " bye", "ok\n\4", 1 + 2.34545, -5, "etc....");
Pero no es tan sencillo, en el analizador sintáctico habría que realizar una buena BNF que soporte todo eso, algo así:
print_expression_list:
print_expression_list ',' expression
| {;} /* por si se escribe print() */
expression:
constante_numerica
| cadena
| variable
| ID
Habría que checar con detenimiento la forma Backus-Naur,
Sobre lo de los nombres de las funciones delimitadas con $$ se puede cambiar, no es mucho problema, el código actual para eso es bastante sencillo, algo así:
[$].+[$] {
strcpy(yylval.
nameFunction, yytext
); yylval.
nameFunction[strlen(yylval.
nameFunction)] = '\0'; return FUNCNAME;
}
[$].+[$] es la expresión regular que utilizo para coincidir $texto$.
Saludos.