Thanks, that's very useful!
I eventually solved this problems by doing:
relationalexpression : shiftexpression
| shiftexpression relationalop relationalexpression
| additiveexpression relationalop relationalexpression
| molecule '<' relationalexpression
;
relationalop : '<='
| '>='
| '<'
| '>'
;
shiftexpression : additiveexpression
| additiveexpression shiftop shiftexpression
;
shiftop : '<<'
| '>' '>'
| '>' '>' '>'
;
But your project will be very helpful to me in the future.
On Tuesday, October 9, 2012 10:44:00 PM UTC+2, Werner Hahn wrote:
>
> I also wrote a parser for Java but I just copied the grammar Java
> Developer Tools (JDT) for Eclipse uses. It turns out that this is actually
> a fairly complicated problem. Keep in mind that there is also the >>>
> operator which further complicates this. Add to that that Java has both
> type arguments as well as type parameters with different syntaxes. The
> grammar JDT uses creates new symbols in order to keep track how many
> brackets have been opened.
>
> I hope it's OK to link my ported solution here. The juicy bits are:
>
> - type arguments:
>
> https://github.com/musiKk/plyj/blob/41bce63c2a2bed6defd12e336b55c207b0cf0677/plyj/parser.py#L1129
> - type parameters:
>
> https://github.com/musiKk/plyj/blob/41bce63c2a2bed6defd12e336b55c207b0cf0677/plyj/parser.py#L1275
>
> By the way being fairly new to parsing I found the Java grammar extremely
> complex. Kudos for doing well so far.
>
>
>
> On Thursday, October 4, 2012 7:58:37 PM UTC+2, Erez wrote:
>>
>> Hi, I'm trying to parse Java and it's going ok so far, except for one
>> problem that I just can't solve, regarding the > token.
>>
>> Consider the following 3 lines:
>>
>> someType<anotherType>> a;
>> if (b > c)
>> d >> e;
>>
>> If I define shift-right as:
>>
>> SHR: '>>'
>> expression: var SHR var
>>
>> then the lexer will match the template code, and the parser will break.
>>
>> But If I define:
>>
>> GT: '>'
>> expression: var GT GT var
>>
>> then the lexer is fine, but the parser chokes on 'b > c', expecting
>> another > to follow.
>> Perhaps there is a way to get the parser to behave?
>>
>> Here is the relevant grammar:
>>
>> relationalexpression : shiftexpression
>> | shiftexpression GT
>> relationalexpression
>>
>> shiftexpression : additiveexpression
>> | additiveexpression GT GT shiftexpression
>>
>> And here is the code that breaks it:
>>
>> a > b;
>>
>> And here is the debug info:
>>
>> State : 140
>> Stack : packagedeclaration _anon_0_star modifiers CLASS identifier
>> IMPLEMENTS typelist LBRACE _anon_10_star modifiers VOID identifier
>> formalparameters LBRACE additiveexpression . LexToken(GT,'>',73,2318)
>> Action : Shift and goto state 254
>>
>> State : 254
>> Stack : packagedeclaration _anon_0_star modifiers CLASS identifier
>> IMPLEMENTS typelist LBRACE _anon_10_star modifiers VOID identifier
>> formalparameters LBRACE additiveexpression GT .
>> LexToken(IDENTIFIER,'b',73,2320)
>> ERROR: Error : packagedeclaration _anon_0_star modifiers CLASS
>> identifier IMPLEMENTS typelist LBRACE _anon_10_star modifiers VOID
>> identifier formalparameters LBRACE additiveexpression GT .
>> LexToken(IDENTIFIER,'b',73,2320)
>>
>>
>> Pleas help me, thank you!
>>
>
--
You received this message because you are subscribed to the Google Groups
"ply-hack" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
To view this discussion on the web visit
https://groups.google.com/d/msg/ply-hack/-/IQOWRb3jKWIJ.
For more options, visit https://groups.google.com/groups/opt_out.