I'm writing a parser for Ruby (http://www.ruby-lang.org/). So far,
it can
parse a sizeable subset of the language. The problem I'm
encountering is as
follows:
`obj.method' is a method call on `obj'. This is parsed correctly.
`obj.method(args)' is a method call with arguments given. Also fine.
`obj.method(args).another_method' is a method call to `obj' with some
arguments, then a method call to the return value of that method.
This is
parsed incorrectly.
A shift/reduce conflict occurs where `obj.method(args)' is seen by my
parser. Instead of reducing when it sees the upcoming `.', it
shifts, and it
ends up with the whole `obj.method(args).another_method' on the
stack. Then
it reduces, and we get `(args).another_method' and hence
`args.another_method'. It's recognised by the parser as something like
`obj.method(args.another_method)' instead.
I'm trying to work out how to convince bison to reduce at this
point, by
manipulating the precedence of ')', '.', etc., but so far to no
avail. Any
ideas? I'll be happy to post the code on request.