Hi,

I've written a simple scanner to match the "FROM t1, t2, .. , tn"
clause within an SQL statement.
The target language is ruby.
Please see below:

%%{

machine from_detector;

# define intereseting keywords
K_FROM = /from/i;

# strings
squoted_string = "'" ( (any - "''")** ) "'";
dquoted_string = '"' ( any )* :>> '"';

# comments
ml_comment = '/*' ( any )* :>> '*/';
sl_comment = '--' ( any )* :>> '\n';
comment = ml_comment | sl_comment;

# define whitespace
ws = space | comment;

simple_identifier = [0-9A-Za-z$#]+;
identifier = simple_identifier | dquoted_string;

# interesting spots
table_reference = (identifier '.')? identifier ('@' identifier)?;
from_spot = ws+ K_FROM ws+ table_reference (ws? ',' ws? table_reference)*;

main := |*
  squoted_string;
  dquoted_string;
  comment;
  from_spot => { puts "found FROM at #{ts}-#{te}" };
  any;
*|;

}%%

data = 'select * from/*comment*/dual, sys.dba_tables;'
eof = data.length
%% write data;
%% write init;
%% write exec;


The problem is that the generated ruby code is invalid and I end up
with the following errors:

from_detector.rb:403: syntax error, unexpected keyword_else, expecting
keyword_when
from_detector.rb:453: syntax error, unexpected keyword_end, expecting $end

Apparently something is wrong with the "any" pattern. If I replace it with:

any => {}

everything's fine and the scanner is working without any problems. Is
this a bug?
I'm using ragel 6.7 with ruby 1.9.3.

Thanks!

-- 
talek

_______________________________________________
ragel-users mailing list
ragel-users@complang.org
http://www.complang.org/mailman/listinfo/ragel-users

Reply via email to