By all accounts, LR(1) should be more powerful in every way compared to LALR(1) since LR(1) builds a canonical collection of LR(1) items, and LALR(1) is just a better SLR(1) parser.
Then why does this grammar work successfully in an LALR(1) parser, but not in an LR(1) parser when I try this input:
int + int
For this grammar:
S' -> S
S -> Add
Add -> Mul
Add -> Add + Mul
Mul -> Const
Mul -> Mul * Mul
Const -> int
Const -> float
These are the JavaScript LR(1) and JavaScript LALR(1) parsers I used for this example:
http://jsmachines.sourceforge.net/machines/lr1.html
http://jsmachines.sourceforge.net/machines/lalr1.html
UPDATE
The JSmachine site is pretty buggy. I used this site instead https://zaa.ch/jison/try/usf/index.html from the University of South Florida, but I was advised to use Bison to ensure correctness.
As the top comment suggested, Mul -> Mul * Mul
is pretty ambiguous so I updated the grammar accordingly
S' -> S
S -> Add
Add -> Mul
Add -> Add + Mul
Mul -> Const
Mul -> Mul * Const
Const -> int
Const -> float
adapted to BNF format:
%%
SS : S ;
S : Add ;
Add : Mul
| Add '+' Mul
;
Mul : Const
| Mul '*' Const
;
Const : int
| float
;
I'm not sure what you mean by "work" in your question. That online parser-generator reports shift-reduce conflicts for both the LR(1) and the LALR(1) algorithms, which is not suprising since your grammar includes the exponentially ambiguous
Apparently, that site's LR(1) implementation handles errors with less grace than it's LALR(1) implementation. I'd say that it's a bug. But in any event, the grammar cannot produce either an LALR(1) or an LR(1) parser.