help-bison
[Top][All Lists]
Advanced

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

token extraction problem within a rule


From: Richard Gill
Subject: token extraction problem within a rule
Date: Thu, 8 Nov 2007 10:49:46 +0100

Hi

I started learning flex/bison some days ago to write a parser. Nearly
all my parser works well, but I've a problem with a rule which matches
well but gives a wrong result in $n. I checked the lexer (flex) did
extract right token. The input is like this:

action close shell:Shell

'action' is a keyword, 'close' too (an option), 'shell' is an
identifier, ':' the identifier separator and 'Shell' a label. I
provided a testset, but to resume, here's what happen:

The syntax is:

action close|okcancel [help] [<button id>:<button text>]

The production rules and defiinition for this kind of line is (DPRINT
is a macro'ed printf) like this:

%token ACTION ACTION_CLOSE ACTION_OKCANCEL OPTION_HELP
%token STRING QSTRING ID

action_line:
        ACTION
        { DPRINT(("* add an action line\n")); }
        action_type action_help_button action_add_button
        ;

action_type:
        ACTION_CLOSE
        { DPRINT(("  - close button\n")); }
        | ACTION_OKCANCEL
        { DPRINT(("  - ok and cancel buttons\n")); }
        ;

action_help_button:
        /* empty */
        | OPTION_HELP
        { DPRINT(("  - help button\n")); }
        ;

action_add_button:
        /* empty */
        | ID
        { DPRINT(("new button id: %s\n", $1)); }
        ':' string
        { DPRINT(("  - additional button #%s '%s'\n", $1, $4));
          DPRINT(("id separator: %s\n", $<str>3)); }
        ;

And string is defined like this (QSTRING refers to quoted strings):

string:
        STRING
        | QSTRING
        ;

The result is perturbing, because in the action_add_button rule, I
have this behaviour:

action_add_button:
        /* empty */
        | ID
        { DPRINT(("new button id: %s\n", $1)); }
>>> $1 = 'shell' ($1 is ok for now)
        ':' string
        { DPRINT(("  - additional button #%s '%s'\n", $1, $4)); }
>>> $1 = 'shell:Shell' (should be 'shell')
>>> $3 = 'shell:Shell' (should be ':')
>>> $4 = 'Shell' (this one is ok)
        ;

To use the test set:

tar zxf testset.tar.gz
cd testset
make
cat test.nds | ./ndlg

I enabled debug output for flex (-d).

Anyone has an idea ?
Regards

-- 
Richard 'riri' GILL
jabber: address@hidden
http://riri.houbathecat.info
http://nasgaia.org
« Frimousse en excessivité émousse son expressivité »

Attachment: testset.tar.gz
Description: GNU Zip compressed data


reply via email to

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