Re: Not able to use x3::skip(skipper)[some recursive rule] in its rule definition

Han Wang <[email protected]>
Newsgroups gmane.comp.parsers.spirit.general
Message-ID <CAPDNnCZuyksg2m9Kx_hKDsvGe-6nhGhuppsa+asZr210P4qVyg@mail.gmail.com>
Hi Larry,

Thanks. I've tried this get_rhs branch but it doesn't solve this problem.
Still get the same error.

Best regards,
Han

On Tue, Jul 25, 2017 at 1:21 PM, Larry Evans <[email protected]>
wrote:

> On 07/25/2017 03:40 AM, Han Wang wrote:
>
>> I've posted the same question in stackoverflow.
>>
>> https://stackoverflow.com/questions/45282293/spirit-not-able
>> -to-use-x3skipskippersome-recursive-rule-in-its-rule-defin
>>
>> Let's say we want to parse a recursive block like this. When
>> "|skip_comments_tag|" is prefixed to the block, we skip all
>> comments(|/*...*/|) within this block recursively.
>>
>> |{{}{skip_comments_tag{{}/*comments*/{/*comments*/}}}}|
>>
>> It's easy to come up with a recursive parser as in Coliru <
>> http://coliru.stacked-crooked.com/a/31fb17064091fae3>.
>>
>> |namespaceParser{autoconstruleComment =x3::lit("/*")>>*(x3::char_
>> -"*/")>>"*/"|x3::space;x3::rule<structSBlockId>construleBlock;autoconstruleBlock_def
>> =x3::lit('{')>>*(ruleBlock |"skip_comments_tag">>x3::skip
>> (ruleComment)[ruleBlock])>>'}';BOOST_SPIRIT_DEFINE(ruleBlock)}|
>>
>> But it doesn't compile (when the |parse| function is called) because it
>> will generate an infinite context (by |x3::make_context| in
>> |x3::skip_directive|). |x3::no_case| and |x3::with| also have this problem
>> because they all use |x3::make_context| in the implementation.
>>
>> Questions:
>>
>>  1. Is there always a better way to write parsers for this kind of
>>     questions to avoid such compile error and how?
>>  2. Or is the |x3::make_context| implementation considered to be flawed
>>     for this kind of questions?
>>
>> BTW: TU seperation doesn't solve this.
>>
>> Hi Han.
>
> You might try the get_rhs branch of a spirit fork here:
>
> https://github.com/cppljevans/spirit/tree/get_rhs
>
> and then #define BOOST_SPIRIT_GET_RHS_CRTP.  As you can see from here:
>
> https://github.com/cppljevans/spirit/blob/get_rhs/include/bo
> ost/spirit/home/x3/nonterminal/detail/rule.hpp#L140
>
> that will disable the x3::make_context calls.
>
> Please let me know if that works.  If so, I might be
> encouraged enough to go to the trouble of creating a pull request
> despite the need (as pointed out in a private email) that
> I'll need to document the rationale for the pull request.
>
> HTH.
>
> -regards,
> Larry
>
>
>
> ------------------------------------------------------------
> ------------------
> Check out the vibrant tech community on one of the world's most
> engaging tech sites, Slashdot.org! http://sdm.link/slashdot
> _______________________________________________
> Spirit-general mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/spirit-general
>

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot

_______________________________________________
Spirit-general mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/spirit-general
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.