En su mayor parte, esto no tiene nada que ver con facilitar a los escritores del compilador y la eficacia del análisis, sino más bien con el diseño de una sintaxis que fomente un código claro, legible y sin ambigüedades.
Los diseñadores de lenguaje pensaron que sería bueno poder escribir literales numéricos como el número 1 como simplemente 1 .
Sería bastante posible diseñar una sintaxis de lenguaje donde los literales numéricos se citaran de alguna manera, por ejemplo tildas, de modo que el literal numérico para el número uno se codificara como ~ 1 ~ y cualquier cosa que no fuera una palabra clave y no se incluyera entre comillas se tratara como un nombre variable .
Para que pueda codificar declaraciones como:
1 = ~2~
two = 1 * ~2~
Pero también:
2 = ~3~
six = 2 + 2
Cualquiera sea la sintaxis que elija, el código ambiguo y difícil de seguir es inevitable.
El lenguaje C y la mayoría de los lenguajes de "llaves" descendientes de C también consideraron una buena idea permitir que los programadores codifiquen los literales Octal y Hexadecimal directamente, y especificar el tipo del literal si esto fuera importante. Asi que
010 // Octal 10 = 8;
0x10 // Hexadecimal 10 = 16;
5l // long integer with decimal value 5
2.0d // double float with value 2
Entonces, incluso si permitía que los nombres de variables comenzaran con un número seguido de una combinación de números y letras que incluía al menos una letra, le presentaría al programador el problema de decidir si un grupo dado formó un nombre de variable o un literal numérico
2lll = 22 // OK
2ll = 2 // compiler error
Tal ambigüedad no ayudaría a nadie a escribir o leer un programa.
Para ver un ejemplo del mundo real estrechamente relacionado, podría ver el lenguaje PL / 1 cuyos diseñadores pensaron que poder usar palabras clave como nombres de variables era una buena idea para que:
IF THEN THEN THEN = ELSE; ELSE ELSE = THEN;
IF IF THEN ELSE = IF; ELSE THEN = ELSE;
DO WHILE (WHILE = DO); END = WHILE + DO; END;
Es un código válido que compila y ejecuta.