It's not a shift-reduce conflict unless it is possible for an identifier to be immediately followed by an (
without being a function call. That's not normally the case, although in C-derived languages, there is the problem of differentiating cast expressions (type)(value)
from parenthesized-function calls (function)(argument)
.
If your grammar does not exhibit that particular C wierdness, then the LALR (1) grammar can decide between shifting and reducing based on the (1) token lookahead: if the lookahead token is a (
, then it shifts the identifier; otherwise, it can reduce.