What do you guys think about this...
fromClause
	: FROM^ { weakKeywords(); } fromRange ( onJoin | pathJoin | COMMA! {
weakKeywords(); } fromRange )*
	;
onJoin
    : ( ( ( LEFT | RIGHT ) (OUTER)? ) | FULL | INNER )? JOIN^
      identifier asAlias ON^ logicalExpression
    ;
pathJoin
    : ( ( ( LEFT | RIGHT ) (OUTER)? ) | FULL | INNER )? JOIN^ (FETCH)?
	  path (asAlias)? (propertyFetch)? (withClause)?
    ;
The "pathJoin" is basically what we currently support.  The "onJoin"
is what we want to support.  Does it look correct to you?