[ragel-users] Problem consuming whitespaces

Adrian Thurston adrian.thurston at esentire.com
Tue Jul 7 14:37:30 UTC 2009


Hi Ihor,

Unless you require the speed of an integrated lexer and parser I would 
suggest using the traditional lexing then parsing approach. That would 
avoid having to put whitespace the grammar.

-Adrian

Ihor Kaharlichenko wrote:
> Hi, all.
> 
> I'm very new to ragel and the solution to my problem may seem obvious, but I googled a lot and could not find a solution to it.
> 
> I need to parse simplified mental ray shader declarations <http://download.autodesk.com/us/maya/2009help/mr/manual/node61.html#SECTION59>.
> 
> In general input looks like this:
> 
> declare shader
>     [/type/] "/shader_name/" (
>         /type/ "/parameter_name/",
>         /type/ "/parameter_name/",
>               ...
>         /type/ "/parameter_name/"
>     )
>     [version /version/_int ]
> end declare
> 
> 
> My problem is that mental ray files are not restrictive to spaces and newlines, so two following declarations should be considered the same:
> 
>    1. declare shader "myShader" ( int "param1", boolean "param2" ) 
>       version 12 end declare
>    2.
> 
>       declare              shader      "myShader" (
>           int     "param1"   ,
>           boolean "param2"
>           )
>           version 12
>       end declare
> 
> Here's my machine declaration:
> 
> %%{
>     machine shader;
>    
>     sep = space+;
>    
>     shader_start = 'declare' . sep . 'shader' . sep;
>     shader_end = 'end' . sep . 'declare' . sep;
>    
>     string = '"' . (alnum | '_')+ . '"' . sep;
>    
>     type = ('boolean' | 'integer' | 'scalar') . sep;
>     version = 'version' . sep . digit+ . sep;
>    
>     parameter = string . type;
>    
>     parameter_block = parameter . (',' . sep . parameter)*;
>     shader =
>         shader_start .
>         type? . string .
>         '(' . sep? . parameter_block? . ')' . sep .
>         version? .
>         shader_end;
>    
>     main := shader;
> }%%
> 
> As you can see there are too many "sep"s used in the declaration. They 
> seem to be a total mess to me, as I don't cannot even match the 
> following with my machine: *int "qwe" ,* (note the space between a quote 
> and a coma)
> 
> Can anybody suggest a better way to define my machine in order to parse 
> such this kind of declarations? Maybe scanners could help me, but I'm 
> not sure whether they are capable to detect format errors or not.
> 
> Thanks, Ihor
> 
> 
> ------------------------------------------------------------------------
> 
> _______________________________________________
> ragel-users mailing list
> ragel-users at complang.org
> http://www.complang.org/mailman/listinfo/ragel-users




More information about the ragel-users mailing list