Simple Grammar causes Infinite Loop. [message #719576] |
Sat, 27 August 2011 23:18 |
Daniel Missing name Messages: 101 Registered: July 2011 |
Senior Member |
|
|
Hi there.
I started a new private project using xtext. During writing my grammar I encountered a really wierd infinite loop. I prepared this small grammar:
CompilationUnit:
'package' name = FQN ';'
rootDeclaration=ClassDeclaration
;
FQN:
ID ('.' ID)*
;
ClassDeclaration:
modifiers=ClassModifiers 'class' name=ID '{'
members+=ClassDeclaration*
'}'
;
enum Visibility:
PUBLIC='public' | PROTECTED='protected' | PRIVATE='private'
;
ClassModifiers returns Modifiers:
{Modifiers}
(
final?='final'?
&
abstract?='abstract'?
&
extern?='extern'?
&
visibility=Visibility?
)
;
If I hit the code completion on any place within a dsl-file the members assignment causes an infinite loop:
at at.mydsl.testlang.ui.contentassist.antlr.internal.InternalTestLangParser.ruleClassDeclaration(InternalTestLangParser.java:288)
at at.mydsl.testlang.ui.contentassist.antlr.internal.InternalTestLangParser.rule__ClassDeclaration__MembersAssignment_4(InternalTestLangParser.java:2537)
at at.mydsl.testlang.ui.contentassist.antlr.internal.InternalTestLangParser.rule__ClassDeclaration__Group__4__Impl(InternalTestLangParser.java:1575)
at at.mydsl.testlang.ui.contentassist.antlr.internal.InternalTestLangParser.rule__ClassDeclaration__Group__4(InternalTestLangParser.java:1518)
at at.mydsl.testlang.ui.contentassist.antlr.internal.InternalTestLangParser.rule__ClassDeclaration__Group__3(InternalTestLangParser.java:1448)
at at.mydsl.testlang.ui.contentassist.antlr.internal.InternalTestLangParser.rule__ClassDeclaration__Group__2(InternalTestLangParser.java:1363)
at at.mydsl.testlang.ui.contentassist.antlr.internal.InternalTestLangParser.rule__ClassDeclaration__Group__1(InternalTestLangParser.java:1288)
at at.mydsl.testlang.ui.contentassist.antlr.internal.InternalTestLangParser.rule__ClassDeclaration__Group__0(InternalTestLangParser.java:1203)
at at.mydsl.testlang.ui.contentassist.antlr.internal.InternalTestLangParser.ruleClassDeclaration(InternalTestLangParser.java:288)
at at.mydsl.testlang.ui.contentassist.antlr.internal.InternalTestLangParser.rule__ClassDeclaration__MembersAssignment_4(InternalTestLangParser.java:2537)
at at.mydsl.testlang.ui.contentassist.antlr.internal.InternalTestLangParser.rule__ClassDeclaration__Group__4__Impl(InternalTestLangParser.java:1575)
at at.mydsl.testlang.ui.contentassist.antlr.internal.InternalTestLangParser.rule__ClassDeclaration__Group__4(InternalTestLangParser.java:1518)
at at.mydsl.testlang.ui.contentassist.antlr.internal.InternalTestLangParser.rule__ClassDeclaration__Group__3(InternalTestLangParser.java:1448)
at at.mydsl.testlang.ui.contentassist.antlr.internal.InternalTestLangParser.rule__ClassDeclaration__Group__2(InternalTestLangParser.java:1363)
at at.mydsl.testlang.ui.contentassist.antlr.internal.InternalTestLangParser.rule__ClassDeclaration__Group__1(InternalTestLangParser.java:1288)
at at.mydsl.testlang.ui.contentassist.antlr.internal.InternalTestLangParser.rule__ClassDeclaration__Group__0(InternalTestLangParser.java:1203)
at at.mydsl.testlang.ui.contentassist.antlr.internal.InternalTestLangParser.ruleClassDeclaration(InternalTestLangParser.java:288)
at at.mydsl.testlang.ui.contentassist.antlr.internal.InternalTestLangParser.rule__ClassDeclaration__MembersAssignment_4(InternalTestLangParser.java:2537)
at at.mydsl.testlang.ui.contentassist.antlr.internal.InternalTestLangParser.rule__ClassDeclaration__Group__4__Impl(InternalTestLangParser.java:1575)
at at.mydsl.testlang.ui.contentassist.antlr.internal.InternalTestLangParser.rule__ClassDeclaration__Group__4(InternalTestLangParser.java:1518)
at at.mydsl.testlang.ui.contentassist.antlr.internal.InternalTestLangParser.rule__ClassDeclaration__Group__3(InternalTestLangParser.java:1448)
at at.mydsl.testlang.ui.contentassist.antlr.internal.InternalTestLangParser.rule__ClassDeclaration__Group__2(InternalTestLangParser.java:1363)
at at.mydsl.testlang.ui.contentassist.antlr.internal.InternalTestLangParser.rule__ClassDeclaration__Group__1(InternalTestLangParser.java:1288)
at at.mydsl.testlang.ui.contentassist.antlr.internal.InternalTestLangParser.rule__ClassDeclaration__Group__0(InternalTestLangParser.java:1203)
at at.mydsl.testlang.ui.contentassist.antlr.internal.InternalTestLangParser.ruleClassDeclaration(InternalTestLangParser.java:288)
It seems the generated UI antlr parse has a bug.
[edit]
meanwhile I found out how to solve the error by rewriting the grammar but the error is still wierd. It seems it's caused by the predicates:
This solution works
CompilationUnit:
'package' name = FQN ';'
rootDeclaration=ClassDeclaration
;
FQN:
ID ('.' ID)*
;
ClassDeclaration:
modifiers=ClassModifiers? 'class' name=ID '{'
members+=ClassDeclaration*
'}'
;
enum Visibility:
PUBLIC='public' | PROTECTED='protected' | PRIVATE='private'
;
ClassModifiers returns Modifiers:
final?='final'?
&
abstract?='abstract'?
&
extern?='extern'?
&
visibility=Visibility
;
Cheers
Daniel
[Updated on: Sat, 27 August 2011 23:30] Report message to a moderator
|
|
|
|
|
|
Re: Simple Grammar causes Infinite Loop. [message #775178 is a reply to message #775170] |
Thu, 05 January 2012 14:04 |
Sebastian Zarnekow Messages: 3118 Registered: July 2009 |
Senior Member |
|
|
Hi Ralph,
a reproducable example is most welcome.
Regards,
Sebastian
--
Need professional support for Eclipse Modeling?
Go visit: http://xtext.itemis.com
Am 05.01.12 14:56, schrieb Ralph Mayr:
> Hello,
>
> I've encountered an issue running Xtext 2.0.1 of which I think it might
> be the same as described here. For testing purposes I updated to Xtext
> 2.2.1 and am still able to reproduce the endless loop.
>
> The bug 360834 is closed (RESOLVED FIXED). Could it be that the same
> issue still exists in 2.2.1, or do you think it's something completely
> different in my case?
>
> Here's what I found out so far:
>
> In public final void rule__<SomeRule>__Group__6__Impl() in my parser a
> call to rule__<SomeRule>__Alternatives_6() causes a RecognitionException
> ("No viable alternative..."). The exception is handled by
> ...__Alternatives_6(). In Group__6__Impl() state._fsp is decremented.
> After that, Group__6__Impl() returns, but winds up at the beginning of
> the switch statement that lead to the call to ...__Alternatives_6()
> again, and so forth.
>
> In my case it also happens when invoking content assist. If it's
> helpful, I guess I also could provide a small grammar for reproduction
> purpose.
>
> Thanks for any advice,
> Ralph.
|
|
|
|
|
|
Powered by
FUDForum. Page generated in 0.03263 seconds