Como verificar o erro de sintaxe do ruby no código ruby

Uso o seguinte agora para verificar o erro de sintaxe:

system "ruby -wc path/to/file.rb"

mas é uma perda de tempo se houver demasiados ficheiros (por exemplo, o código de refactório), por isso a minha pergunta é: existe alguma forma de verificar a sintaxe do ruby no código de ruby?

 11
Author: cimi3386284gt, 2014-12-03

3 answers

Em RM, pode usar RubyVM::InstructionSequence#compile (documentação relevante ) para compilar o código Ruby (que irá abrir excepções se existirem erros):

2.1.0 :001 > RubyVM::InstructionSequence.compile "a = 1 + 2"
 => <RubyVM::InstructionSequence:<compiled>@<compiled>>

2.1.0 :002 > RubyVM::InstructionSequence.compile "a = 1 + "
<compiled>:1: syntax error, unexpected end-of-input
a = 1 +
        ^
SyntaxError: compile error
        from (irb):2:in `compile'
        from (irb):2
        from /usr/local/rvm/rubies/ruby-2.1.0/bin/irb:11:in `<main>'
 7
Author: Chris Heald, 2015-01-02 20:31:25
A minha experiência tem sido que a maneira mais fácil de verificar se o meu código está devidamente compilado é fazer testes automáticos. O compilador vai fazer o mesmo trabalho se está compilando para executar testes ou apenas verificando que os arquivos estão lexicamente corretos.

IRM

O analisador da RM está escrito em C. não encontrei uma referência específica a como aceder a ele, embora tenha a certeza que há uma forma de o fazer. Se ao menos alguém tivesse passado algum tempo a tornar a Ruby mais consciente...

Rubinius

Em Rubinius, há acesso directo ao analisador via Melbourne.
rbx-2.2.10 :039 > Rubinius::ToolSets::Runtime::Melbourne.parse_file("./todo.txt")
SyntaxError: expecting keyword_do or '{' or '(': ./todo.txt:2:17

E para um ficheiro ruby válido:

rbx-2.2.10 :044 > Rubinius::ToolSets::Runtime::Melbourne.parse_file('./valid.rb')
=> #<Rubinius::ToolSets::Runtime::AST::Class:0x1e6b4 @name=#    <Rubinius::ToolSets::Runtime::AST::ClassName:0x1e6b8 @name=:RubyStuff @line=1 @superclass=#<Rubinius::ToolSets::Runtime::AST::NilLiteral:0x1e6bc @line=1>> @body=#<Rubinius::ToolSets::Runtime::AST::EmptyBody:0x1e6c8 @line=1> @line=1 @superclass=#<Rubinius::ToolSets::Runtime::AST::NilLiteral:0x1e6bc @line=1>>

Linha De Comandos

Está a usar ferramentas de linha de comandos para processar o ruby. Se estás a fazer um loop através de ficheiros em Ruby, talvez devesses levar isso também para a linha de comandos e fazer algo do género:

jw@logopolis:/projects/open/compile-test$ find . | grep ".rb$" | xargs ruby -c
Syntax OK

jw@logopolis:/projects/open/compile-test$ find . | grep ".rb$" | xargs ruby -c
./invalid.rb:2: expecting $end: ./invalid.rb:2:3
Que se parece com isto em Ruby:
 system "find . | grep ".rb$" | xargs ruby -c"

Referências

Http://rubini.us/doc/en/bytecode-compiler/parser/

 3
Author: MustModify, 2015-01-02 17:45:50

Pode usar o Ripper, a interface de Ruby para o analisador de Ruby:

Http://ruby-doc.org/stdlib/libdoc/ripper/rdoc/Ripper.html

 0
Author: David Grayson, 2016-09-14 02:34:31