help-bison
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: a easy way to treat flexible token order?


From: Tim Van Holder
Subject: Re: a easy way to treat flexible token order?
Date: 11 Feb 2003 08:38:41 +0100

On Mon, 2003-02-10 at 18:04, Jibin Han wrote: 
> Hi,
>     The data file I am processing has some flexible token order, for
> example, a complete line can be:
>         firstname="something", middlename="something",
> lastname="something"
>     or
>         firstname="something", lastname="something",
> middlename="something"
>     or
>         lastname="something", firstname="something",
> middlename="something"
> 
>     I am wondering if there is some easy way to handle this other than
> my current practice by writing a rule and action for each case?
> 
> Thanks!

I suppose it depends on how flexible or strict you want to be.
If you want _only_ the three cases above, you're stuck with three rules:

complete_line
: firstname_setting ',' middlename_setting ',' lastname_setting
  {
    ...
  }
| firstname_setting ',' lastname_setting ',' middlename_setting
  {
    ...
  }
| lastname_setting ',' firstname_setting ',' middlename_setting
  {
    ...
  }
;

But if you don't mind accepting combinations that make less sense (such
as three lastname settings), you could just have:

name_setting
: firstname_setting
| lastname_setting
| middlename_setting
;

complete_line
: name_setting ',' name_setting ',' name_setting
  {
    ...
  }
;

Of course, if you need to see exactly one of each you would have to add
extra checking in your actions, the parser can't do it for you anymore.

Or you could even set it up as a list of comma-separated name_setting
non-terminals, if the number of settings can vary as well as their
order:

name_setting
: firstname_setting
| lastname_setting
| middlename_setting
;

complete_line
: name_setting
  {
    ...
  }
| complete_line ',' name_setting
  {
    ...
  }
;

-- 
Tim Van Holder <address@hidden>





reply via email to

[Prev in Thread] Current Thread [Next in Thread]