Aquí hay un programa básico de Ruby:
puts 1 puts 1 puts 1 puts 1 puts 1 puts 1 puts 1Estas son las reglas principales de la sintaxis BNF para Ruby (abreviado): fuente: https://github.com/goruby/goruby/blob/master/goruby.bnf o https://cse.buffalo.edu/~regan/ cse305/RubyBNF.pdf
PROGRAM : COMPSTMT ; COMPSTMT : STMT | COMPSTMT TERM | COMPSTMT TERM EXPR | COMPSTMT TERM EXPR TERM ; STMT : "BEGIN" "{" COMPSTMT "}" | "END" "{" COMPSTMT "}" | EXPR ;Dado que un PROGRAM es solo un COMPSTMT, y un COMPSTMT nunca es solo un {COMPSTMT}, ¿cómo es posible que el intérprete valide mi código? No puedo dibujar el gráfico gramatical que conduce a mi programa.
Solo debe autorizar dos expresiones, no más (COMPSTMT TERM EXPR TERM).
¿Ruby pone un comienzo/fin bajo el capó para autorizar una iteración de COMPSTMT, o estoy malinterpretando las reglas?
Tenga en cuenta que los dos BNF que compartió difieren en algunas partes. Voy a utilizar la definición de la primera fuente . También tenga en cuenta que esta no es una fuente oficial, esto es de la implementación del lenguaje Go de Ruby, pero suponga que es lo suficientemente correcto.
En primer lugar, podemos considerar la línea "puts 1" como una EXPR , ya que es un comando ( ver aquí ), así que esto es lo que necesitamos tener al final. Sin embargo, tiene razón, no puede obtener 7 valores EXPR uno tras otro. Sin embargo, eso es realmente correcto, y su problema es que olvidó agregar la definición de un valor TERM . Veamos qué hace:
TERM : ";" | "\n" ; A partir de esto, puede ver fácilmente que TERM en realidad significa terminación (en lugar de término , un término de uso común (juego de palabras) en los gráficos BNF que generalmente ocurren al describir las partes de operaciones matemáticas de la gramática)
A partir de esto, se vuelve obvio que su código anterior no es en realidad 7 valores EXPR , es EXPR "\n" EXPR "\n" EXPR "\n" EXPR "\n" EXPR "\n" EXPR "\n" EXPR , y esto lo podemos obtener del BNF anterior
Cada línea es una sola sustitución, excepto al final:
PROGRAM COMPSTMT COMPSTMT TERM EXPR COMPSTMT TERM EXPR TERM EXPR COMPSTMT TERM EXPR TERM EXPR TERM EXPR COMPSTMT TERM EXPR TERM EXPR TERM EXPR TERM EXPR COMPSTMT TERM EXPR TERM EXPR TERM EXPR TERM EXPR TERM EXPR COMPSTMT TERM EXPR TERM EXPR TERM EXPR TERM EXPR TERM EXPR TERM EXPR STMT TERM EXPR TERM EXPR TERM EXPR TERM EXPR TERM EXPR TERM EXPR EXPR TERM EXPR TERM EXPR TERM EXPR TERM EXPR TERM EXPR TERM EXPR EXPR "\n" EXPR "\n" EXPR "\n" EXPR "\n" EXPR "\n" EXPR "\n" EXPR "puts 1" "\n" "puts 1" "\n" "puts 1" "\n" "puts 1" "\n" "puts 1" "\n" "puts 1" "\n" "puts 1"