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

时间:2014-12-03 13:03:22

标签: ruby

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

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

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

4 个答案:

答案 0 :(得分:6)

在MRI下,你可以使用RubyVM::InstructionSequence#compilerelevant documentation)来编译Ruby代码(如果有错误会抛出异常):

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>'

答案 1 :(得分:3)

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

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')
=> #<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>>

命令行

您目前正在使用命令行工具来解析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/

答案 2 :(得分:1)

最简单的方法是使用命令行 -c 标志:

ruby -c file_you_want_to_check.rb

答案 3 :(得分:0)

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

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