home *** CD-ROM | disk | FTP | other *** search
/ Solo Programadores 22 / SOLO_22.iso / disk22 / compila / letra.bnf < prev    next >
Encoding:
Text File  |  1996-01-16  |  7.8 KB  |  191 lines

  1. # Sintáxis BNF de Letra ampliada y comentada, esta sintáxis no es ningún pro-
  2. # grama (aunque parezca uno) es solo una forma de estructurar nuestro lenguaje
  3. # de programación para poder crear un compilador para él fácilmente.
  4.  
  5. # Se define un programa como una sucesión de cualquier número de sentencias
  6. # (incluso cero) y a continuación de ellas la pieza p_eof (fin de fichero)
  7.  
  8. <PROGRAMA> ::= { <SENTENCIA> } p_eof
  9.  
  10. # Se define una sentencia como uno cualquiera de los siguientes elementos
  11.  
  12. <SENTENCIA> ::=
  13.   <ETIQUETA> | <DECLARACION_DATOS> | <ASIGNACION> | <SENT_SI> |
  14.   <SENT_MIENTRAS> | <SENT_REPETIR> | <SENT_IR> | <SENT_HACER> |
  15.   <SENT_VOLVER> | <FUNCION_INTERNA>
  16.  
  17. # Una etiqueta no será más que una pieza de tipo etiqueta (estas las reconocía
  18. # el analizador léxico, pues eran nombres que empezaban con un punto).
  19.  
  20. <ETIQUETA> ::= p_etiqueta
  21.  
  22. # Una sentencia "declaración de datos" se construye comenzando con la palabra
  23. # reservada DATOS y finaliza con FIN, entre estas dos puede aparecer cualquier
  24. # número de declaraciones de datos, estas empiezan todas con un identificador
  25. # (el nombre de la variable) y a continuación, de manera opcional, puede apare-
  26. # cer una declaración de este dato para inicializarlo o bien para indicar que
  27. # se trata de una tabla de datos.
  28.  
  29. <DECLARACION_DATOS> ::=
  30.   p_datos
  31.   { p_identificador [ <INICIALIZACION_DATO> | <INICIALIZACION_TABLA> ] }
  32.   p_fin
  33.  
  34. # Una sentencia de asignación se define como una referencia a un dato (que
  35. # podra ser una simple variable o bien una tabla con su índice) seguida siempre
  36. # del signo igual (=) y una expresión cualquiera.
  37.  
  38. <ASIGNACION> ::= <DATO> p_igual <EXPRESION>
  39.  
  40. # La sentencia si (más conocida como if ... else ... endif) será la palabra
  41. # reservada SI y una expresión, tras las cuales puede aparecer cualquier número
  42. # de sentencias y entonces la palabra FIN (finalizando la sentencia) o bien la
  43. # palabra SINO, otra serie de sentencias y la palabra FIN.
  44.  
  45. <SENT_SI> ::= p_si <EXPRESION> { <SENTENCIA> } [ p_sino { <SENTENCIA> } ] p_fin
  46.  
  47. # La sentencia mientras (while), palabra reservada MIENTRAS, una expresión,
  48. # cualquier número de sentencias y FIN.
  49.  
  50. <SENT_MIENTRAS> ::= p_mientras <EXPRESION> { <SENTENCIA> } p_fin
  51.  
  52. # Sentencia repetir (do ... while, o bien repeat ... until), REPETIR seguido
  53. # de una serie de sentencias y entonces HASTA seguido de una expresion
  54.  
  55. <SENT_REPETIR> ::= p_repetir { <SENTENCIA> } p_hasta <EXPRESION>
  56.  
  57. # Sentencia ir (goto), la palabra reservada IF seguida de una etiqueta
  58.  
  59. <SENT_IR> ::= p_ir p_etiqueta
  60.  
  61. # Sentencia hacer (gosub), GOSUB seguido de una etiqueta
  62.  
  63. <SENT_HACER> ::= p_hacer p_etiqueta
  64.  
  65. # Sentencia volver (return), simplemente la palabra reservada VOLVER
  66.  
  67. <SENT_VOLVER> ::= p_volver
  68.  
  69. # La inicialización de un dato definido en la zona de datos se podrá hacer
  70. # poniendo un signo igual y después una constante.
  71.  
  72. <INICIALIZACION_DATO> ::= p_igual <CONSTANTE>
  73.  
  74. # Para inicializar una tabla de datos deberemos indicar entre corchetes su
  75. # longitud (con un entero) pudiendo despues, opcionalmente, indicar el conte-
  76. # nido de la tabla con un signo igual y varias constantes separadas por sím-
  77. # bolos dos puntos (:). Otra posible definición admitida es definir una tabla
  78. # omitiendo su longitud entre los corchetes, pero en dicho caso será obligato-
  79. # ria la inicialización de la tabla (para poder calcular su longitud).
  80.  
  81. <INICIALIZACION_TABLA> ::=
  82.   p_abrir_corchete
  83.     (p_entero p_cerrar_corchete
  84.     [ p_igual <CONSTANTE> { p_dos_puntos <CONSTANTE> } ] |
  85.     p_cerrar_corchete p_igual <CONSTANTE> { p_dos_puntos <CONSTANTE> } )
  86.  
  87. # Una constante puede ser, las palabras reservadas CIERTO o FALSO (true, false)
  88. # un entero (opcionalmente precedido de un + o un -) o bien un literal (un
  89. # texto entre comillas).
  90.  
  91. <CONSTANTE> ::= p_cierto | p_falso | [ p_mas | p_menos ] p_entero | p_literal
  92.  
  93. # Una referencia a un dato es simplemente el nombre de ese dato, y si es una
  94. # tabla debemos indicar entre corchetes a que posición de ella nos referimos
  95. # utilizando una expresión
  96.  
  97. <DATO> ::= p_identificador [ p_abrir_corchete <EXPRESION> p_cerrar_corchete ]
  98.  
  99. # Una expresión se define como un cómputo (una expresión sin operadores
  100. # lógicos), tras la cual, mientras venga un operador lógico, pueden seguirle
  101. # mas cómputos.
  102.  
  103. <EXPRESION> ::= <COMPUTO> { <OP_LOGICO> <COMPUTO> }
  104.  
  105. # Un computo se define igualmente como un valor (expresión sin operadores
  106. # lógicos ni de comparación) o varios separados por operadores de comparación.
  107.  
  108. <COMPUTO> ::= <VALOR> { <OP_COMPARACION> <VALOR> }
  109.  
  110. # Un valor será un término (expresión que solo puede utilizar los operadores
  111. # binarios de mayor prioridad: multiplicar, dividir o módulo) o varios
  112. # separados por operadores del nivel aditivo (suma y resta)
  113.  
  114. <VALOR> ::= <TERMINO> { <OP_ADITIVO> <TERMINO> }
  115.  
  116. # Un término será un factor (el elemento básico de una expresión) o varios
  117. # separados por operadores del nivel multiplicativo).
  118.  
  119. <TERMINO> ::= <FACTOR> { <OP_MULTIPLICATIVO> <FACTOR> }
  120.  
  121. # Un factor, es el elemento básico de una expresión como son: CIERTO, FALSO, un
  122. # número entero, un literal, una referencia a un dato (o tabla) o bien otra
  123. # expresión completa entre paréntesis. A estos elementos les puede preceder un
  124. # operador unario (o varios), como los signos positivo y negativo o el operador
  125. # NO de negación (el not lógico).
  126.  
  127. <FACTOR> ::= 
  128.   <OP_UNARIO> <FACTOR> | p_abrir_parentesis <EXPRESION> p_cerrar_parentesis |
  129.   <DATO> | p_cierto | p_falso | p_entero | p_literal
  130.  
  131. # Operadores de nivel logico Y (and) y O (or), son los operadores de menor
  132. # prioridad en el cálculo.
  133.  
  134. <OP_LOGICO> ::= p_y | p_o
  135.  
  136. # A estos les siguen los operadores de comparación siguientes.
  137.  
  138. <OP_COMPARACION> ::=
  139.   p_mayor | p_mayor_igual | p_menor | p_menor_igual | p_igual | p_distinto
  140.  
  141. # Los operadores de nivel aditivo son solo la suma y la resta.
  142.  
  143. <OP_ADITIVO> ::= p_mas | p_menos
  144.  
  145. # Los de nivel multiplicativo, el signo de multiplicar, de dividir y el de
  146. # módulo (o resto de una división entera) son los operadores binarios de mayor
  147. # prioridad (binario quiere decir que opera con los elementos que tiene a su
  148. # izquierda y a su derecha, obteniendo un resultado de ambos).
  149.  
  150. <OP_MULTIPLICATIVO> ::= p_multiplicar | p_dividir | p_modulo
  151.  
  152. # Los operadores unarios afectan directamente (y únicamente) a el factor que
  153. # tienen a continuación, por ello son de mayor prioridad que los binarios.
  154.  
  155. <OP_UNARIO> ::= p_mas | p_menos | p_no
  156.  
  157. # Por último definiremos las funciones internas del lenguaje, que actúan como
  158. # si se tratara de otras sentencias, y son las siguientes.
  159.  
  160. <FUNCION_INTERNA> ::=
  161.   <BORRAR_PANTALLA> | <ESCRIBIR> | <LEER_TECLA> | <MOVER_CURSOR> |
  162.   <COLOR> | <ALEATORIO> | <ESPERAR> | <LEER_CARACTER> | <PONER_CARACTER>
  163.  
  164. # Todas las funciones se definen como una palabra reservada determinada, que
  165. # es el nombre de la función, y después entre paréntesis los parámetros que
  166. # se requieran. Las funciones que requieren como parámetro un <DATO> (referen-
  167. # cia a un dato o posición de tabla) es por que van a devolver un valor en
  168. # dicho dato. Estas sentencias tienen la siguiente sintaxis:
  169.  
  170. <BORRAR_PANTALLA> ::= p_borrar_pantalla p_abrir_parentesis p_cerrar_parentesis
  171.  
  172. <ESCRIBIR> ::= p_escribir p_abrir_parentesis p_literal p_cerrar_parentesis
  173.  
  174. <LEER_TECLA> ::= p_leer_tecla p_abrir_parentesis <DATO> p_cerrar_parentesis
  175.  
  176. <MOVER_CURSOR> ::=
  177.   p_mover_cursor p_abrir_parentesis <EXPRESION> p_coma
  178.   <EXPRESION> p_cerrar_parentesis
  179.  
  180. <COLOR> ::= p_color p_abrir_parentesis <EXPRESION> p_cerrar_parentesis
  181.  
  182. <ALEATORIO> ::= p_aleatorio p_abrir_parentesis <DATO> p_cerrar_parentesis
  183.  
  184. <ESPERAR> ::= p_esperar p_abrir_parentesis <EXPRESION> p_cerrar_parentesis
  185.  
  186. <LEER_CARACTER> ::=
  187.   p_leer_carácter p_abrir_parentesis <DATO> p_cerrar_parentesis
  188.  
  189. <PONER_CARACTER> ::=
  190.   p_poner_carácter p_abrir_parentesis <EXPRESION> p_cerrar_parentesis
  191.