You want to use 'inject' or 'reduce' not map.

You are building up a matcher by 'or'ing it with the previous matcher.


---
"No man is an island... except Philip"


On 22 February 2012 04:16, David Sklar <[email protected]> wrote:

> I have a list of strings that are magical tokens in the pre-existing
> language I am writing a grammar for.
>
> Right now, my rules for parsing them look something like:
>
>
> rule(:regular_label) { match('[a-z0-9.]').repeat(1) }
>
> magic_words = ["magic1","moremagic","evenmoremagic"]
>
> magic_words.each do |m|
>  rule("magic_{#m}".to_sym) { str(m) }
> end
>
> rule(:magic_label) { :magic_magic1 | :magic_moremagic |
> :magic_evenmoremagic }
>
>
> rule(:any_label) { :magic_label | :regular_label }
>
> Is there a way I can dynamically generate the :magic_label rule? I'd
> like to avoid having to update two places if the list of magic strings
> changes.
>
> I.e. in pseudocode, I'd like to be able to do something like:
>
> rule(:magic_label) {
>  something_wonderful(magic_words.map |m| { "magic_#{m}.to_sym" }.join('
> | '))
> }
>
> Where the something_wonderful() method would take the string it is
> passed and turn it into a rule body.
>
> Thanks,
> David
>
>

Reply via email to