Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

242
Visualizações
Error de iteración de Ruby EBNF COMPSTMT

Aquí hay un programa básico de Ruby:

 puts 1 puts 1 puts 1 puts 1 puts 1 puts 1 puts 1

Estas 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?

over 4 years ago · Santiago Trujillo
1 Respostas
Responde à pergunta

0

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"
over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda