I typically don't recommend Ragel for DNS due to it being a binary protocol, but it can be done.

With Ragel there are two ways to count things. You can use conditions to check for the counters getting down to zero. The advantage of conditions is that you can more freely use machines with with embedded conditions in the construction of other machines.

The other approach is the one you're taking, which is to count and call/return in actions. This is generally easier to program, because it more closely resembles standard programming practice. The downside is that you lose the ability freely union and you have to be more careful with the other operations. The call/return statements are best for high level flow control and can get you into a bind when used for the inner definitions of a grammar.

All in all, you may find that a hand-written parser for DNS is faster and simpler due to all the counting.

-Adrian

Pete Gervais wrote:
I’m using ragel to decode protocols as a test of its capabilities.

One of the protocols is DNS.

This protocol has a fixed set of fields followed by one or more optional fields. The count of these optional fields are encoded within the fixed data field.

Would the code below be the best way to do this ?Initial the dnsAnswer section called via fcall dnsAnswer. It then sequentially processes all fields in the order given. In the last field, dnsAnswerResourceDataField , it gets the count of the number of answer fields included in the protocol, then perform a series of fgoto’s until the dnsRecordCount is 0 at which time it returns.

dnsAnswer := (

                                dnsAnswerNameField .

                                dnsAnswerTypeField .

                                dnsAnswerClassField .

                                dnsAnswerTimeToLiveField .

                                dnsAnswerResourceDataLengthField .

dnsAnswerResourceDataField @{ cout << "In dnsAnswer processing" << endl; if (fsm->getdnsAnswerRecordCount() > 0 ) {

                                                fsm->dnsAnswerRecordCount--;

                                                fgoto dnsAnswer; } else {

                                                fret; }

                }

                );

Regards,

Peter J. Gervais

President, Simtree Information Systems

17621 Island Rd,

RR#2 , Martintown,

Martintown,Ont

K0C 1S0

Business: 613-938-6549

Cell: 613-864-7370

E-mail: [email protected]


------------------------------------------------------------------------

_______________________________________________
ragel-users mailing list
[email protected]
http://www.complang.org/mailman/listinfo/ragel-users

_______________________________________________
ragel-users mailing list
[email protected]
http://www.complang.org/mailman/listinfo/ragel-users

Reply via email to