parsing - Simple Grammar for Lemon LALR Parser -


i've been stuck since while now. want parse simple as:

likes: word1 word2 .. wordn hates: word1 word2 .. wordn

i using lemon+flex. @ moment grammar looks :

%left likes moods hates info.  %syntax_error {     std::cout << "syntax error!" << std::endl;   }     final ::= likes_stmt. final ::= hates_stmt.  likes_stmt ::= likes list(a). { data *data=data::getinstance();data->likes.push_back(a);} hates_stmt ::= hates list(a). { data *data=data::getinstance();data->hates.push_back(a);}  list ::= likes_stmt value(a).   { data *data=data::getinstance();data->likes.push_back(a);} list ::= hates_stmt value(a).   { data *data=data::getinstance();data->hates.push_back(a); }  list(a) ::= value(b).           {a=b;} 

but works first 2 words. doing wrong , in recursive definition ? heads appreciated :)

@crozzfire, ira provided correct answer original question, consider voting it.

let me answer question additional requirement separate parsed values 2 lists. don't create different rules parsing of these lists since grammar of list same both cases. need flag indicate whether likes or hates found in front of list. 4th parameter of lemon's parse function suits best needs. see "the parser interface" section of lemon documentation.

below updated ira's grammar sets , check such flag variable. take note rules set_likes_state , set_hites_state need placed before likes , hates token have associated action executed when tokens reduced.

    %extra_argument {unsigned* state}      final ::= likes_stmt.     final ::= hates_stmt.      likes_stmt ::= set_likes_state likes list(a).     hates_stmt ::= set_hites_state hates list(a).      list ::= list value(a).   { if (*state == 0) {/*add list1*/} else {/*add list2*/}; }     list ::= value(a).        { if (*state == 0) {/*add list1*/} else {/*add list2*/}; }      set_likes_state ::= .     { *state = 0; }     set_hites_state ::= .     { *state = 1; } 

Comments

Popular posts from this blog

c# - How to set Z index when using WPF DrawingContext? -

razor - Is this a bug in WebMatrix PageData? -

visual c++ - Using relative values in array sorting ( asm ) -