如何检查ruby代码中的ruby语法错误

我现在用以下来检查语法错误:

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

但是如果文件太多(例如,我的重构代码),它会浪费时间,所以我的问题是:有没有办法在ruby代码中进行ruby语法检查?

在MRI下,你可以使用RubyVM::InstructionSequence#compile ( 相关文档 )来编译Ruby代码(如果有错误会抛出exception):

 2.1.0 :001 > RubyVM::InstructionSequence.compile "a = 1 + 2" => @> 2.1.0 :002 > RubyVM::InstructionSequence.compile "a = 1 + " :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 `
'

我的经验是,检查我的代码是否正确编译的最简单方法是运行自动化测试。 无论是编译运行测试还是只检查文件在词法上是否正确,编译器都会做同样的工作。

MRI

MRI的解析器是用C语言编写的。我找不到具体的参考方法,但我确信有办法解决这个问题。 如果只有人花了一些时间让Ruby更容易识别Ruby ……

Rubinius的

在Rubinius,可以通过墨尔本直接访问解析器:

 rbx-2.2.10 :039 > Rubinius::ToolSets::Runtime::Melbourne.parse_file("./todo.txt") SyntaxError: expecting keyword_do or '{' or '(': ./todo.txt:2:17 

并为有效的ruby文件:

 rbx-2.2.10 :044 > Rubinius::ToolSets::Runtime::Melbourne.parse_file('./valid.rb') => #> @body=# @line=1 @superclass=#> 

命令行

您当前正在使用命令行工具来解析ruby。 如果您正在使用Ruby中的文件进行循环,也许您应该将其带到命令行并执行以下操作:

 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 

在Ruby中看起来像这样:

  system "find . | grep ".rb$" | xargs ruby -c" 

参考

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

您可以使用Ripper,Ruby解析器的Ruby接口:

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