Hi,
I am trying to create a Ragel parser for SVG Path syntax. I lifted the
grammar from SVG specification and adapted it to be compatible with
Ragel. When I try to compile it, Ragel just hangs instead of finishing
immediately like it usually does. I understand that the machine might
need adjustments but it's difficult to guess what's wrong.
I'd like to get an advice from more experienced Ragel users.
Here's the machine for SVG path:
%%{
machine PathParser;
wsp = (" " | 9 | 13 | 10);
digit_sequence = digit+;
sign = "+" | "-";
exponent = ( "e" | "E" ) sign? digit_sequence;
fractional_constant = digit_sequence? "." digit_sequence |
digit_sequence ".";
floating_point_constant = fractional_constant exponent? |
digit_sequence exponent;
integer_constant = digit_sequence;
comma = ",";
comma_wsp = (wsp+ comma? wsp*) | (comma wsp*);
flag = "0" | "1";
number = sign? integer_constant | sign? floating_point_constant;
nonnegative_number = integer_constant | floating_point_constant;
coordinate = number;
coordinate_pair = coordinate comma_wsp? coordinate;
elliptical_arc_argument = nonnegative_number comma_wsp?
nonnegative_number comma_wsp? number comma_wsp flag comma_wsp? flag
comma_wsp? coordinate_pair;
elliptical_arc_argument_sequence = elliptical_arc_argument (comma_wsp?
elliptical_arc_argument)*;
elliptical_arc = ( "A" | "a" ) wsp* elliptical_arc_argument_sequence;
smooth_quadratic_bezier_curveto_argument_sequence = coordinate_pair
(comma_wsp? coordinate_pair)*;
smooth_quadratic_bezier_curveto = ( "T" | "t" ) wsp*
smooth_quadratic_bezier_curveto_argument_sequence;
quadratic_bezier_curveto_argument = coordinate_pair comma_wsp?
coordinate_pair;
quadratic_bezier_curveto_argument_sequence =
quadratic_bezier_curveto_argument (comma_wsp?
quadratic_bezier_curveto_argument)*;
quadratic_bezier_curveto = ( "Q" | "q" ) wsp*
quadratic_bezier_curveto_argument_sequence;
smooth_curveto_argument = coordinate_pair comma_wsp? coordinate_pair;
smooth_curveto_argument_sequence = smooth_curveto_argument (comma_wsp?
smooth_curveto_argument)*;
smooth_curveto = ( "S" | "s" ) wsp* smooth_curveto_argument_sequence;
curveto_argument = coordinate_pair comma_wsp? coordinate_pair
comma_wsp? coordinate_pair;
curveto_argument_sequence = curveto_argument (comma_wsp?
curveto_argument)*;
curveto = ( "C" | "c" ) wsp* curveto_argument_sequence;
vertical_lineto_argument_sequence = coordinate (comma_wsp? coordinate)*;
vertical_lineto = ( "V" | "v" ) wsp* vertical_lineto_argument_sequence;
horizontal_lineto_argument_sequence = coordinate (comma_wsp?
coordinate)*;
horizontal_lineto = ( "H" | "h" ) wsp*
horizontal_lineto_argument_sequence;
lineto_argument_sequence = coordinate_pair (comma_wsp?
coordinate_pair)*;
lineto = ( "L" | "l" ) wsp* lineto_argument_sequence;
closepath = ("Z" | "z");
moveto_argument_sequence = coordinate_pair | coordinate_pair comma_wsp?
lineto_argument_sequence;
moveto = ( "M" | "m" ) wsp* moveto_argument_sequence;
drawto_command = closepath | lineto | horizontal_lineto |
vertical_lineto | curveto | smooth_curveto | quadratic_bezier_curveto |
smooth_quadratic_bezier_curveto | elliptical_arc;
drawto_commands = drawto_command (wsp* drawto_command)*;
moveto_drawto_command_group = moveto wsp* drawto_commands?;
moveto_drawto_command_groups = moveto_drawto_command_group (wsp*
moveto_drawto_command_group)*;
svg_path := wsp* moveto_drawto_command_groups? wsp*;
}%%
package com.wireframesketcher.ui.svg.parser;
class PathParser
{
%% write data;
public void parse(String string)
{
int cs;
int p;
int pe;
int eof;
char[] data;
int ts;
int act;
int te;
%% write init;
data = string.toCharArray();
p = 0;
pe = string.length();
eof = pe;
%% write exec;
}
}
_______________________________________________
ragel-users mailing list
[email protected]
http://www.complang.org/mailman/listinfo/ragel-users