The problem with making >> one token is the problem C++ templates has with `map<int, list<int>>`. I know it can be changed to be something like D which i think is map!(int, list!(int)) but I'd like to have the option of doing it in C++ which i may not take.
On Tue, Jun 4, 2013 at 8:32 PM, Valentin Tolmer <nitnela...@gmail.com>wrote: > On Wed 05 Jun 2013 12:06:30 AM CEST, Adam Smalin wrote: > >> During my test to get << a difference precedence then < I suspect it is >> impossible because after expr < expr [<] it has no idea if it will be a << >> expr or an < expression thus I can't tell it to have a different >> precedence >> between < and < <. >> >> Because I can't I wrote this test grammar. When I execute `a<b< <cd<e` I >> get << < < as I wanted. The issue is 2 shift reduce conflicts. I can't >> understand it. It does exactly what I want (<< before <). Its has >> %glr-parser at the top. Why isn't it ok shifting and reducing when it >> can't >> complete the longer rule (mainElement3). I'm just confused all over I >> don't >> see the conflict. How would I rewrite this to not have the conflict? >> >> %nonassoc DOLLAR >> //%left '<' >> %left '*' PREC >> %left '.' >> >> >> %% >> program: mEOS main >> main: | mainLoop mEOS >> mainLoop: >> mainElement >> | mainLoop mainElement >> mainElement: >> mainElement3 >> | mainElement '<' mainElement3 { printf("<\n"); } >> mainElement3: >> mainElement4 >> | mainElement3 '<' '<' mainElement4 { printf("<<\n"); } >> mainElement4: >> '$' VarName %prec DOLLAR { printf("varname\n"); } >> | mainElement2 >> //| mainElement '*' mainElement { printf("*\n"); } >> mainElement2: >> VAR { printf("var %s\n", yytext); } >> | Token { printf("token\n"); } >> >> Token: '.' >> VarName: VAR >> | VarName '.' VAR >> >> EOS: '\n' | ';' >> mEOS: | mEOS EOS >> >> %% >> >> >> state 12 >> >> 6 mainElement: mainElement3 . [$end, VAR, '.', '<', '$', '\n', ';'] >> 9 mainElement3: mainElement3 . '<' '<' mainElement4 >> >> '<' shift, and go to state 22 >> >> '<' [reduce using rule 6 (mainElement)] >> $default reduce using rule 6 (mainElement) >> >> state 24 >> >> 7 mainElement: mainElement '<' mainElement3 . [$end, VAR, '.', '<', >> '$', '\n', ';'] >> 9 mainElement3: mainElement3 . '<' '<' mainElement4 >> >> '<' shift, and go to state 22 >> >> '<' [reduce using rule 7 (mainElement)] >> $default reduce using rule 7 (mainElement) >> ______________________________**_________________ >> help-bison@gnu.org >> https://lists.gnu.org/mailman/**listinfo/help-bison<https://lists.gnu.org/mailman/listinfo/help-bison> >> > > If this is a possibility, you could detect a double << at the lexer level, > and give the parser a special token corresponding to <<. That would > simplify your grammar. > _______________________________________________ help-bison@gnu.org https://lists.gnu.org/mailman/listinfo/help-bison