2013-08-02 105 views
4

我使用XTEXT 2.4,並希望支持地圖和設置,我的語法看起來像這樣XTEXT處理左遞歸語法

<term> ::- <collection> 
<collection> ::- <map> | <set> 
<map> ::- '{' (<term> ':' <term> (',' <term> ':' <term>)*)? '}' 
<set> ::- '{' (<term> (',' <term>)*)+ '}' 

從而

<term> ::- '{' (<term> ':' <term> (',' <term> ':' <term>)*)? '}' | 
      '{' (<term> (',' <term>)*)+ '}' 

ANTLR抱怨它可以簡化這個語法開始左遞歸,我不知道爲什麼,因爲它有「{」在右手邊。

即使我想將相同的部分分解出來,我不知道如何在xtext中這樣做,因爲EObject現在被拆分爲兩個生產規則,並且分析的數據不能存儲在同一個對象中。

有幫助嗎?

============================================== ============================== 通訊XTEXT語法我寫的是

grammar org.xtext.problem.Term with org.eclipse.xtext.common.Terminals 

generate term "http://www.xtext.org/problem/Term" 

Term: 
    term = Collection 
; 

Collection: 
    MyMap | MySet 
; 

MyMap: 
    {MyMap} '{'(keys+= Term ':' values += Term (',' keys+=Term ':' values +=Term)* )?'}' 
; 

MySet: 
    {MySet} '{'(values += Term (',' values +=Term)* )?'}' 
; 

錯誤消息(與開始錯誤(211)):

0 [main] INFO lipse.emf.mwe.utils.StandaloneSetup - Registering platform uri '/Users/jcwu/opensource/xtext-problemistic' 
116 [main] INFO lipse.emf.mwe.utils.StandaloneSetup - Adding generated EPackage 'org.eclipse.xtext.xbase.XbasePackage' 
454 [main] INFO clipse.emf.mwe.utils.GenModelHelper - Registered GenModel 'http://www.eclipse.org/Xtext/Xbase/XAnnotations' from 'platform:/resource/org.eclipse.xtext.xbase/model/Xbase.genmodel' 
459 [main] INFO clipse.emf.mwe.utils.GenModelHelper - Registered GenModel 'http://www.eclipse.org/xtext/xbase/Xtype' from 'platform:/resource/org.eclipse.xtext.xbase/model/Xbase.genmodel' 
479 [main] INFO clipse.emf.mwe.utils.GenModelHelper - Registered GenModel 'http://www.eclipse.org/xtext/xbase/Xbase' from 'platform:/resource/org.eclipse.xtext.xbase/model/Xbase.genmodel' 
479 [main] INFO clipse.emf.mwe.utils.GenModelHelper - Registered GenModel 'http://www.eclipse.org/xtext/common/JavaVMTypes' from 'platform:/resource/org.eclipse.xtext.common.types/model/JavaVMTypes.genmodel' 
1660 [main] INFO ipse.emf.mwe.utils.DirectoryCleaner - Cleaning /Users/jcwu/opensource/xtext-problemistic/org.xtext.problem.term/../org.xtext.problem.term/src-gen 
1665 [main] INFO ipse.emf.mwe.utils.DirectoryCleaner - Cleaning /Users/jcwu/opensource/xtext-problemistic/org.xtext.problem.term/../org.xtext.problem.term.ui/src-gen 
1666 [main] INFO ipse.emf.mwe.utils.DirectoryCleaner - Cleaning /Users/jcwu/opensource/xtext-problemistic/org.xtext.problem.term/../org.xtext.problem.term.tests/src-gen 
2033 [main] INFO ipse.xtext.generator.LanguageConfig - generating infrastructure for org.xtext.problem.Term with fragments : ImplicitRuntimeFragment, ImplicitUiFragment, GrammarAccessFragment, EcoreGeneratorFragment, SerializerFragment, ResourceFactoryFragment, XtextAntlrGeneratorFragment, ValidatorFragment, ImportNamespacesScopingFragment, QualifiedNamesFragment, BuilderIntegrationFragment, GeneratorFragment, FormatterFragment, LabelProviderFragment, OutlineTreeProviderFragment, QuickOutlineFragment, QuickfixProviderFragment, ContentAssistFragment, XtextAntlrUiGeneratorFragment, Junit4Fragment, RefactorElementNameFragment, TypesGeneratorFragment, XbaseGeneratorFragment, CodetemplatesGeneratorFragment, CompareFragment 
4115 [main] INFO clipse.emf.mwe.utils.GenModelHelper - Registered GenModel 'http://www.xtext.org/problem/Term' from 'platform:/resource/org.xtext.problem.term/src-gen/org/xtext/problem/Term.genmodel' 
error(211): ../org.xtext.problem.term/src-gen/org/xtext/problem/parser/antlr/internal/InternalTerm.g:119:1: [fatal] rule ruleCollection has non-LL(*) decision due to recursive rule invocations reachable from alts 1,2. Resolve by left-factoring or using syntactic predicates or using backtrack=true option. 
5918 [main] ERROR enerator.CompositeGeneratorFragment - java.io.FileNotFoundException: ../org.xtext.problem.term/src-gen/org/xtext/problem/parser/antlr/internal/InternalTermLexer.java (No such file or directory) 
org.eclipse.emf.common.util.WrappedException: java.io.FileNotFoundException: ../org.xtext.problem.term/src-gen/org/xtext/problem/parser/antlr/internal/InternalTermLexer.java (No such file or directory) 
    at org.eclipse.xtext.util.Files.readFileIntoString(Files.java:129) 
    at org.eclipse.xtext.generator.parser.antlr.AbstractAntlrGeneratorFragment.suppressWarningsImpl(AbstractAntlrGeneratorFragment.java:132) 
    at org.eclipse.xtext.generator.parser.antlr.AbstractAntlrGeneratorFragment.suppressWarnings(AbstractAntlrGeneratorFragment.java:142) 
    at org.eclipse.xtext.generator.parser.antlr.AbstractAntlrGeneratorFragment.suppressWarnings(AbstractAntlrGeneratorFragment.java:138) 
    at org.eclipse.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment.generate(XtextAntlrGeneratorFragment.java:49) 
    at org.eclipse.xtext.generator.CompositeGeneratorFragment.generate(CompositeGeneratorFragment.java:92) 
    at org.eclipse.xtext.generator.LanguageConfig.generate(LanguageConfig.java:113) 
    at org.eclipse.xtext.generator.Generator.generate(Generator.java:361) 
    at org.eclipse.xtext.generator.Generator.invokeInternal(Generator.java:128) 
    at org.eclipse.emf.mwe.core.lib.AbstractWorkflowComponent.invoke(AbstractWorkflowComponent.java:126) 
    at org.eclipse.emf.mwe.core.lib.Mwe2Bridge.invoke(Mwe2Bridge.java:34) 
    at org.eclipse.emf.mwe.core.lib.AbstractWorkflowComponent.invoke(AbstractWorkflowComponent.java:201) 
    at org.eclipse.emf.mwe2.runtime.workflow.AbstractCompositeWorkflowComponent.invoke(AbstractCompositeWorkflowComponent.java:35) 
    at org.eclipse.emf.mwe2.runtime.workflow.Workflow.run(Workflow.java:19) 
    at org.eclipse.emf.mwe2.launch.runtime.Mwe2Runner.run(Mwe2Runner.java:102) 
    at org.eclipse.emf.mwe2.launch.runtime.Mwe2Runner.run(Mwe2Runner.java:62) 
    at org.eclipse.emf.mwe2.launch.runtime.Mwe2Runner.run(Mwe2Runner.java:52) 
    at org.eclipse.emf.mwe2.launch.runtime.Mwe2Launcher.run(Mwe2Launcher.java:74) 
    at org.eclipse.emf.mwe2.launch.runtime.Mwe2Launcher.main(Mwe2Launcher.java:35) 
Caused by: java.io.FileNotFoundException: ../org.xtext.problem.term/src-gen/org/xtext/problem/parser/antlr/internal/InternalTermLexer.java (No such file or directory) 
    at java.io.FileInputStream.open(Native Method) 
    at java.io.FileInputStream.<init>(FileInputStream.java:138) 
    at java.io.FileInputStream.<init>(FileInputStream.java:97) 
    at org.eclipse.xtext.util.Files.readFileIntoString(Files.java:126) 
    ... 18 more 
error(211): ../org.xtext.problem.term.ui/src-gen/org/xtext/problem/ui/contentassist/antlr/internal/InternalTerm.g:176:1: [fatal] rule rule__Collection__Alternatives has non-LL(*) decision due to recursive rule invocations reachable from alts 1,2. Resolve by left-factoring or using syntactic predicates or using backtrack=true option. 
6617 [main] ERROR enerator.CompositeGeneratorFragment - java.io.FileNotFoundException: ../org.xtext.problem.term.ui/src-gen/org/xtext/problem/ui/contentassist/antlr/internal/InternalTermLexer.java (No such file or directory) 
org.eclipse.emf.common.util.WrappedException: java.io.FileNotFoundException: ../org.xtext.problem.term.ui/src-gen/org/xtext/problem/ui/contentassist/antlr/internal/InternalTermLexer.java (No such file or directory) 
    at org.eclipse.xtext.util.Files.readFileIntoString(Files.java:129) 
    at org.eclipse.xtext.generator.parser.antlr.AbstractAntlrGeneratorFragment.suppressWarningsImpl(AbstractAntlrGeneratorFragment.java:132) 
    at org.eclipse.xtext.generator.parser.antlr.AbstractAntlrGeneratorFragment.suppressWarnings(AbstractAntlrGeneratorFragment.java:142) 
    at org.eclipse.xtext.generator.parser.antlr.AbstractAntlrGeneratorFragment.suppressWarnings(AbstractAntlrGeneratorFragment.java:138) 
    at org.eclipse.xtext.generator.parser.antlr.XtextAntlrUiGeneratorFragment.generate(XtextAntlrUiGeneratorFragment.java:53) 
    at org.eclipse.xtext.generator.CompositeGeneratorFragment.generate(CompositeGeneratorFragment.java:92) 
    at org.eclipse.xtext.generator.LanguageConfig.generate(LanguageConfig.java:113) 
    at org.eclipse.xtext.generator.Generator.generate(Generator.java:361) 
    at org.eclipse.xtext.generator.Generator.invokeInternal(Generator.java:128) 
    at org.eclipse.emf.mwe.core.lib.AbstractWorkflowComponent.invoke(AbstractWorkflowComponent.java:126) 
    at org.eclipse.emf.mwe.core.lib.Mwe2Bridge.invoke(Mwe2Bridge.java:34) 
    at org.eclipse.emf.mwe.core.lib.AbstractWorkflowComponent.invoke(AbstractWorkflowComponent.java:201) 
    at org.eclipse.emf.mwe2.runtime.workflow.AbstractCompositeWorkflowComponent.invoke(AbstractCompositeWorkflowComponent.java:35) 
    at org.eclipse.emf.mwe2.runtime.workflow.Workflow.run(Workflow.java:19) 
    at org.eclipse.emf.mwe2.launch.runtime.Mwe2Runner.run(Mwe2Runner.java:102) 
    at org.eclipse.emf.mwe2.launch.runtime.Mwe2Runner.run(Mwe2Runner.java:62) 
    at org.eclipse.emf.mwe2.launch.runtime.Mwe2Runner.run(Mwe2Runner.java:52) 
    at org.eclipse.emf.mwe2.launch.runtime.Mwe2Launcher.run(Mwe2Launcher.java:74) 
    at org.eclipse.emf.mwe2.launch.runtime.Mwe2Launcher.main(Mwe2Launcher.java:35) 
Caused by: java.io.FileNotFoundException: ../org.xtext.problem.term.ui/src-gen/org/xtext/problem/ui/contentassist/antlr/internal/InternalTermLexer.java (No such file or directory) 
    at java.io.FileInputStream.open(Native Method) 
    at java.io.FileInputStream.<init>(FileInputStream.java:138) 
    at java.io.FileInputStream.<init>(FileInputStream.java:97) 
    at org.eclipse.xtext.util.Files.readFileIntoString(Files.java:126) 
    ... 18 more 
6650 [main] INFO text.generator.junit.Junit4Fragment - generating Junit4 Test support classes 
6682 [main] INFO text.generator.junit.Junit4Fragment - generating Compare Framework infrastructure 
7118 [main] INFO .emf.mwe2.runtime.workflow.Workflow - Done. 
+0

我不明白,爲什麼你的時候,你要使用的Xtext編寫一個ANTLR語法。該語法的Xtext是完全地不同的,有同樣關於什麼可以放進一個規則並沒有什麼differt要求。 –

+0

@ A.H。 Xtext使用ANTLR來解析它自己的DSL。 Ray Wu可能在他的控制檯/日誌中看到ANTLR風味的錯誤消息。 –

+0

RayWu,左遞歸規則可能源於其他地方(您發佈的一個的確不是左遞歸)。你能發表一個小的Xtext語法來證明這個問題嗎? –

回答

2

的工作的Xtext語法您的問題是這樣的:

Model: term += Term*; 

Term: c=Collection; 

Collection: (=> Map | Set); 

Map: '{' {Map} (entries += MapEntry (',' entries += MapEntry)*)? '}'; 
MapEntry: key=Term ':' value=Term; 

Set: '{' (values += Term (',' values += Term)*)+ '}'; 

一點需要注意:

  • Collection規則的=>語法謂詞。這導致Xtext/ANTLR進入正確的方向。 (Docu here

  • {Map} 「簡單的動作」(Docu here)創建了一個Map即使內容爲空。

  • 附加MapEntry規則還要求,否則你有什麼可保持鍵/值對。

  • 您的語法允許{}{}{}{}, {}, {}Set之內。這可能是也可能不是你想要的。

所以,在我看來,大約LL遞歸的Xtext/ANTLR的錯誤信息是不是最合適在這種情況下。這不是關於LL遞歸但大約在語法歧義有時可以通過施加=>來解決。有關更多詳細信息,請參閱鏈接的文檔。

僅供參考:語法可以解析簡單和嵌套像這樣的東西:

// Maps 
{} 
{ {} : {} } 
{ {} : {}, {} : {}} 

// Sets 
{ {} } 
{ {} {} {} {} } 
{ {}, {}, {}, {} } 

// nested/mixed 
{ { { {}:{} } } : {}, {} : { {}:{} }} 
{ { { {}:{} } } : {}, {} : { {}:{ {}{}{} } }} 
+0

{ {} {}問題是由term + = Term *引入的,但我確實在其他規則中處理了該問題。我認爲句法謂語是我的問題的關鍵。讓我深入一點。 (接受爲答案) –