A bug in Ragel?
DinSoft
dinesh.bolkenst... at epfl.ch
Sun May 6 20:40:43 UTC 2007
Hello everyone,
I don't understand Ragel's behaviour on one point.
Currently, I am implementing a parser for SPF (RFC 4408).
Everything was fine and working well but this.
Here is a snippet of the grammar rules in Ragel's syntax (full ABNF
available at http://www.ietf.org/rfc/rfc4408.txt):
qualifier = ([+-?~]) >action_qualifier_1
@action_qualifier_2;
all = ("all"i) >action_all_1 @action_all_2;
version = ("v=spf1"i) >action_version_1
@action_version_2;
name = (alpha ( alpha | digit | "-" | "_" | "." )*) >action_name_1
@action_name_2;
redirect = ("redirect"i "=" domain_spec) >action_redirect_1
@action_redirect_2;
unknown_modifier = (name "=" macro_string)
>action_unknown_modifier_1 @action_unknown_modifier_2;
explanation = ("exp"i "=" domain_spec) >action_explanation_1
@action_explanation_2;
mechanism = (all | include2 | A | MX | PTR | IP4 | IP6
| exists) >action_mechanism_1 @action_mechanism_2;
directive = ((qualifier)? mechanism) >action_directive_1
@action_directive_2;
terms_spaces = ((' '){1,}) >action_terms_spaces_1
@action_terms_spaces_2;
terms_directive = (terms_spaces directive) >action_terms_directive_1
@action_terms_directive_2;
terms_modifier = (terms_spaces modifier) >action_terms_modifier_1
@action_terms_modifier_2;
terms = (( terms_directive | terms_modifier )*) >action_terms_1
@action_terms_2; # May be empty
record_spaces = ((' ')*) >action_record_spaces_1
@action_record_spaces_2; # May be empty
record = (version terms record_spaces) >action_record_1
@action_record_2;
# Language's starting rule
main := record;
With the following user-action for qualifier:
# qualifier
action action_qualifier_1 {
element.type = PARSE_ELEMENT_TYPE_QUALIFIER_START;
element.start = fpc;
if (doubleLinkedListAddLast(&qualifier, element)) {
goto atoi_error;
}
}
action action_qualifier_2 {
element.type = PARSE_ELEMENT_TYPE_QUALIFIER_STOP;
element.stop = fpc;
if (doubleLinkedListAddLast(&qualifier, element)) {
goto atoi_error;
}
}
(all rule do have the same kind of user actions).
Now I find amazing that, on the input "v=spf1 =all" , I am getting the
'=' as being considered as a qualifier !
Here is the dump of my doubleLinkedList for qualifier:
Parsing: v=spf1 =all!
qualifier list: 2 elements in the list!
Start: 134729663 (=)
Stop: 134729663 (=)
When I go back to the rule of qualifier, I see:
qualifier = ([+-?~]) >action_qualifier_1 @action_qualifier_2;
So how is it possible that Ragel considers '=' as being a qualifier?
I was expecting a parse error (from the rule unknown_modifier ,
because the rule "name" cannot be empty).
Thanks for your help !
Regards,
Dinesh Bolkensteyn
More information about the ragel-users
mailing list