2014-12-03 13 views
8

Io uso a seguito ora per controllare errore di sintassi:Come controllare errore di sintassi Ruby in codice Ruby

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

ma perdere tempo molto se ci sono troppi file (ad esempio, i refactory codice), in modo la mia domanda è: c'è un modo per sintassi ruby ​​controllare il codice rubino?

+0

Sembra come si sta facendo nel modo giusto. Potrebbe essere interessante per te: https://github.com/cypher/git-ruby-syntax-check/blob/master/pre-commit –

+0

controlla la sintassi in runtime? –

+0

dove metti quella linea? – Stefan

risposta

1

La mia esperienza è stata che il modo più semplice per verificare se il mio codice è stato compilato correttamente è quello di eseguire test automatici. Il compilatore farà lo stesso lavoro sia che compili per eseguire i test sia che controlli che i file siano lessicalmente corretti.

MRI

parser di risonanza magnetica è scritto in C. non riuscivo a trovare un riferimento specifico alla modalità di accesso, anche se sono sicuro che c'è un modo per farlo. Se solo qualcuno avesse trascorso qualche tempo rendendo più Rubino Rubino-aware ...

Rubinius

In Rubinius, si accede direttamente al parser 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 per un rubino valida File:

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

riga di comando

stai usin g strumenti da riga di comando per analizzare ruby. Se si sta facendo un po 'di loop attraverso i file in Ruby, forse si dovrebbe semplicemente prendere che alla riga di comando come bene e fare qualcosa di simile:

[email protected]:/projects/open/compile-test$ find . | grep ".rb$" | xargs ruby -c 
Syntax OK 

[email protected]:/projects/open/compile-test$ find . | grep ".rb$" | xargs ruby -c 
./invalid.rb:2: expecting $end: ./invalid.rb:2:3 

che assomiglia a questo in Ruby:

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

Riferimenti

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

6

Sotto la risonanza magnetica, è possibile utilizzare RubyVM::InstructionSequence#compile (relevant documentation) per compilare codice Ruby (che getterà le eccezioni se esimo ere sono errori):

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