Bug 569520 - Infinite loop when parsing invalid code
Summary: Infinite loop when parsing invalid code
Status: NEW
Alias: None
Product: TMF
Classification: Modeling
Component: Xtext (show other bugs)
Version: 2.24   Edit
Hardware: PC Windows 10
: P3 normal (vote)
Target Milestone: ---   Edit
Assignee: Project Inbox CLA
QA Contact:
URL:
Whiteboard:
Keywords:
Depends on:
Blocks:
 
Reported: 2020-12-07 05:46 EST by Seyedhossein Ghasemi CLA
Modified: 2020-12-09 05:51 EST (History)
1 user (show)

See Also:


Attachments
Sample code with the minimal grammar (7.14 MB, application/x-zip-compressed)
2020-12-07 05:46 EST, Seyedhossein Ghasemi CLA
no flags Details

Note You need to log in before you can comment on or make changes to this bug.
Description Seyedhossein Ghasemi CLA 2020-12-07 05:46:21 EST
Created attachment 284982 [details]
Sample code with the minimal grammar

Hello everyone.
I am new with xtext and I am writing a grammar.
when I run my code and open a sample code (Writen based on the grammer) eclipse try to parse it and then the code create an infinite loop. I tryed to trace the code it seems that there is some problem related to recoverFromMismatchedToken.
I attached a sample code with minimal grammar.
I appraciate any help from you.
Best regard,
Seyedhossein Ghasemi
Comment 1 Christian Dietrich CLA 2020-12-07 05:51:27 EST
hi,

when i create a parsing test based on your sample, i get

org.eclipse.xtext.parser.ParseException: Implement me
	at org.eclipse.xtext.parser.antlr.AbstractAntlrParser.doParse(AbstractAntlrParser.java:106)
	at org.eclipse.xtext.parser.antlr.AbstractAntlrParser.parse(AbstractAntlrParser.java:85)
	at org.eclipse.xtext.parser.antlr.AbstractAntlrParser.doParse(AbstractAntlrParser.java:63)
	at org.eclipse.xtext.parser.AbstractParser.parse(AbstractParser.java:34)
	at org.eclipse.xtext.resource.XtextResource.doLoad(XtextResource.java:177)
	at org.eclipse.xtext.linking.lazy.LazyLinkingResource.doLoad(LazyLinkingResource.java:115)
	at org.eclipse.emf.ecore.resource.impl.ResourceImpl.load(ResourceImpl.java:1563)
	at org.eclipse.xtext.testing.util.ResourceHelper.resource(ResourceHelper.java:57)
	at org.eclipse.xtext.testing.util.ParseHelper.parse(ParseHelper.java:50)
	at org.eclipse.xtext.testing.util.ParseHelper.parse(ParseHelper.java:69)
	at org.eclipse.xtext.testing.util.ParseHelper.parse(ParseHelper.java:65)
	at org.xtext.example.mydsl1.tests.MyDslParsingTest.loadModel(MyDslParsingTest.java:53)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:688)
	at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131)
	at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:149)
	at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:140)
	at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:84)
	at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115)
	at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37)
	at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104)
	at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98)
	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$6(TestMethodTestDescriptor.java:210)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:206)
	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:131)
	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:65)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129)
	at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1541)
	at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:143)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129)
	at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1541)
	at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:143)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129)
	at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84)
	at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32)
	at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)
	at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:108)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:88)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:54)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:67)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:52)
	at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:96)
	at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:84)
	at org.eclipse.jdt.internal.junit5.runner.JUnit5TestReference.run(JUnit5TestReference.java:98)
	at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:41)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:542)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:770)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:464)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:210)
Caused by: java.lang.UnsupportedOperationException: Implement me
	at org.xtext.example.mydsl1.parser.antlr.MyDslTokenSource.getBeginTokenType(MyDslTokenSource.java:26)
	at org.eclipse.xtext.parser.antlr.AbstractIndentationTokenSource.createBeginToken(AbstractIndentationTokenSource.java:182)
	at org.eclipse.xtext.parser.antlr.AbstractIndentationTokenSource.splitIntoBeginToken(AbstractIndentationTokenSource.java:159)
	at org.eclipse.xtext.parser.antlr.AbstractIndentationTokenSource.doSplitTokenImpl(AbstractIndentationTokenSource.java:104)
	at org.eclipse.xtext.parser.antlr.AbstractIndentationTokenSource.doSplitToken(AbstractIndentationTokenSource.java:73)
	at org.eclipse.xtext.parser.antlr.AbstractSplittingTokenSource.splitToken(AbstractSplittingTokenSource.java:93)
	at org.eclipse.xtext.parser.antlr.AbstractSplittingTokenSource.nextToken(AbstractSplittingTokenSource.java:60)
	at org.eclipse.xtext.parser.antlr.AbstractIndentationTokenSource.nextToken(AbstractIndentationTokenSource.java:83)
	at org.antlr.runtime.CommonTokenStream.fillBuffer(CommonTokenStream.java:119)
	at org.antlr.runtime.CommonTokenStream.toString(CommonTokenStream.java:350)
	at org.eclipse.xtext.parser.antlr.AbstractInternalAntlrParser.parse(AbstractInternalAntlrParser.java:586)
	at org.eclipse.xtext.parser.antlr.AbstractAntlrParser.doParse(AbstractAntlrParser.java:103)
	... 78 more



is this the same you get?
Comment 2 Christian Dietrich CLA 2020-12-07 05:53:10 EST
i miss the impl in your example as well
Comment 3 Christian Dietrich CLA 2020-12-07 05:58:17 EST
it would also be nice to have a reproducing unit test
Comment 4 Seyedhossein Ghasemi CLA 2020-12-07 08:07:19 EST
Hi ,
Thank you so much for your quick response. No, I don't get this error. I create a unit test too and I faced the same problem and infinite loop.
You can find the unit test attached.


/*
 * generated by Xtext 2.23.0.M3
 */
package org.xtext.example.mydsl.tests

import com.google.inject.Inject
import org.eclipse.xtext.testing.InjectWith
import org.eclipse.xtext.testing.extensions.InjectionExtension
import org.eclipse.xtext.testing.util.ParseHelper
import org.junit.jupiter.api.Assertions
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.^extension.ExtendWith
import org.xtext.example.mydsl.myDsl.Document
import org.eclipse.xtext.util.EmfFormatter

@ExtendWith(InjectionExtension)
@InjectWith(MyDslInjectorProvider)
class MyDslParsingTest {
	@Inject
	ParseHelper<Document> parseHelper
	
	@Test
	def void loadModel() {
		
		var model = parseHelper.parse('''
		IDENTIFICATION DIVISION.
		PROGRAM-ID. 
		PROCEDURE DIVISION.
		   SECTION_ONE SECTION.
		   SECTION_ONE
		   .
		   ACCEPT SECTION_ONE FROM DATE.
		
		''')
		
		println(EmfFormatter.objToStr(model))
		
		
		val result = 1
		Assertions.assertNotNull(result)
		
	}
	
	
}
Comment 5 Christian Dietrich CLA 2020-12-07 08:09:57 EST
the unit test works fine once i implement
MyDslTokenSource
Comment 6 Seyedhossein Ghasemi CLA 2020-12-07 08:39:34 EST
Is it possible to share your implementation of MyDslTokenSource?
Comment 7 Christian Dietrich CLA 2020-12-07 09:05:56 EST
should be straight forward

	@Override
	protected int getBeginTokenType() {
		return InternalMyDslParser.RULE_DATA_ENTRY_BLOCK_START;
	}

	@Override
	protected int getEndTokenType() {
		return InternalMyDslParser.RULE_DATA_ENTRY_BLOCK_END;
	}
Comment 8 Christian Dietrich CLA 2020-12-08 04:31:04 EST
any update here?
Comment 9 Seyedhossein Ghasemi CLA 2020-12-09 05:51:14 EST
Hi Christian.
Thank you so much for your help.
I am testing the codes. I still have some problem and I need to make sure that the problem is related to this ticket.
I will update this ticket as soon as possible. (in the next few days)