2014-11-10 1 views
1

Я начал изучать XText в последнее время и пытался сделать простую вещь - вместо пользовательских терминалов вместо определения значения org.eclipse.xtext.common.Terminals.Пользовательские терминалы в XText

Сначала я создал BlahLang.xtest через wizard в пакете x.mvmn.blah.xtext.

Затем я проверил учебники и сделал две вещи: a) Создал пользовательский файл терминалов в том же пакете, где был мой xtext-файл. А именно Test.xtext в x.mvmn.blah.xtext.

Содержимое файла были такими же, как и в Terminals.xtext, но с исправленной пакета декларации:

grammar x.mvmn.blah.xtext.Test hidden(WS, ML_COMMENT, SL_COMMENT) 

import "http://www.eclipse.org/emf/2002/Ecore" as ecore 

terminal ID: 
    '^'? ('a'..'z' | 'A'..'Z' | '_') ('a'..'z' | 'A'..'Z' | '_' | '0'..'9')*; 

terminal INT returns ecore::EInt: 
    ('0'..'9')+; 

terminal STRING: 
    '"' ('\\' . /* 'b'|'t'|'n'|'f'|'r'|'u'|'"'|"'"|'\\' */ | !('\\' | '"'))* '"' | 
    "'" ('\\' . /* 'b'|'t'|'n'|'f'|'r'|'u'|'"'|"'"|'\\' */ | !('\\' | "'"))* "'"; 

terminal ML_COMMENT: 
    '/*'->'*/'; 

terminal SL_COMMENT: 
    '//' !('\n' | '\r')* ('\r'? '\n')?; 

terminal WS: 
    (' ' | '\t' | '\r' | '\n')+; 

terminal ANY_OTHER: 
    .; 

б) В моем файле BlahLang.xtext Я импортировал файл через «с» вместо декларации из org.eclipse.xtext.common.Terminals, помещенной там мастера:

grammar x.mvmn.blah.xtext.BlahLang with x.mvmn.blah.xtext.Test 

generate blahLang "http://www.mvmn.x/blah/xtext/BlahLang" 

Model: 
    greetings+=Greeting*; 

Greeting: 
    'Hello' name=ID '!'; 

по всей документации и подсказок, которые я нашел в Интернете все, что должен был быть в порядке. Но ничего не работает - файлы, созданные XText ссылаются на несуществующие классы:

x.mvmn.blah.xtext.services.TestGrammarAccess 
x.mvmn.blah.xtext.TestStandaloneSetup 
x.mvmn.blah.xtext.validation.TestValidator 

Я пробовал различные обходные пути (играл с добавлением «генерировать» в Test.xtext и т.д.), но ничего не получалось. Я практически застрял и не имею ни малейшего понятия, что не так, и как я могу это исправить.

Пожалуйста, помогите.

ответ

2

Похоже, что вы не создали надлежащую инфраструктуру для грамматики терминалов. Вы можете использовать ту же конфигурацию генератора, которая используется для Xtext c ommon.Terminals.

component = Generator auto-inject { 
    pathRtProject = runtimeProject 
    projectNameRt = runtimeProjectName 
    language = { 
     uri = "platform:/resource/x.mvmn.blah/src/x/mvmn/blah/xtext/Test.xtext" 
     fragment = grammarAccess.GrammarAccessFragment auto-inject {} 
     fragment = parseTreeConstructor.ParseTreeConstructorFragment {} 
    } 
} 
+0

Благодарим за ответ. Я вообще не генерировал его - мастера XText генерировали все, я написал только два файла .xtext. Я экспериментирую с вашим предложением и дам вам знать, если это сработает. – mvmn

+0

Добавлен собственный ответ с окончательным разрешением. Я основывался на вашем предположении. Большое спасибо. – mvmn

+0

P.S. В конце концов, это не сработало, но я думаю, что сам поправлюсь отсюда. Еще раз спасибо. – mvmn

0

Благодаря предложению Себастьяна я наконец-то удалось сделать XText код производят, что не будет показывать ошибки компиляции при добавлении этого компонента генератора на мой GenerateBlahLang.mwe2 (в основном скопированы из существующего генератора, при этом некоторые части закомментирована из-за ошибка «Вы не можете генерировать анализатор ANTLR для грамматики без правил производства», отображаемые во время генерации):

component = Generator auto-inject { 
     pathRtProject = runtimeProject 
     pathUiProject = "${runtimeProject}.ui" 
     pathTestProject = "${runtimeProject}.tests" 
     projectNameRt = projectName 
     projectNameUi = "${projectName}.ui" 
     encoding = encoding 
     language = { 
      uri = "classpath:/x/mvmn/blah/xtext/Test.xtext"// Java API to access grammar elements (required by several other fragments) 
      fragment = grammarAccess.GrammarAccessFragment auto-inject {} 

      // generates Java API for the generated EPackages 
      fragment = ecore.EMFGeneratorFragment auto-inject {} 

      // the old serialization component 
      // fragment = parseTreeConstructor.ParseTreeConstructorFragment auto-inject {}  

      // serializer 2.0 
      fragment = serializer.SerializerFragment auto-inject { 
       generateStub = false 
      } 

      // a custom ResourceFactory for use with EMF 
      fragment = resourceFactory.ResourceFactoryFragment auto-inject {} 

      // The antlr parser generator fragment. 
      //fragment = parser.antlr.XtextAntlrGeneratorFragment auto-inject { 
      // options = { 
      //  backtrack = true 
      // } 
      //} 

      // Xtend-based API for validation 
      fragment = validation.ValidatorFragment auto-inject { 
      // composedCheck = "org.eclipse.xtext.validation.ImportUriValidator" 
      // composedCheck = "org.eclipse.xtext.validation.NamesAreUniqueValidator" 
      } 

      // old scoping and exporting API 
      // fragment = scoping.ImportURIScopingFragment auto-inject {} 
      // fragment = exporting.SimpleNamesFragment auto-inject {} 

      // scoping and exporting API 
      fragment = scoping.ImportNamespacesScopingFragment auto-inject {} 
      fragment = exporting.QualifiedNamesFragment auto-inject {} 
      fragment = builder.BuilderIntegrationFragment auto-inject {} 

      // generator API 
      fragment = generator.GeneratorFragment auto-inject {} 

      // formatter API 
      fragment = formatting.FormatterFragment auto-inject {} 

      // labeling API 
      fragment = labeling.LabelProviderFragment auto-inject {} 

      // outline API 
      fragment = outline.OutlineTreeProviderFragment auto-inject {} 
      fragment = outline.QuickOutlineFragment auto-inject {} 

      // quickfix API 
      fragment = quickfix.QuickfixProviderFragment auto-inject {} 

      // content assist API 
      fragment = contentAssist.ContentAssistFragment auto-inject {} 

      // generates a more lightweight Antlr parser and lexer tailored for content assist 
      //fragment = parser.antlr.XtextAntlrUiGeneratorFragment auto-inject {} 

      // generates junit test support classes into Generator#pathTestProject 
      fragment = junit.Junit4Fragment auto-inject {} 

      // rename refactoring 
      fragment = refactoring.RefactorElementNameFragment auto-inject {} 

      // provides the necessary bindings for java types integration 
      fragment = types.TypesGeneratorFragment auto-inject {} 

      // generates the required bindings only if the grammar inherits from Xbase 
      fragment = xbase.XbaseGeneratorFragment auto-inject {} 

      // generates the required bindings only if the grammar inherits from Xtype 
      fragment = xbase.XtypeGeneratorFragment auto-inject {} 

      // provides a preference page for template proposals 
      //fragment = templates.CodetemplatesGeneratorFragment auto-inject {} 

      // provides a compare view 
      fragment = compare.CompareFragment auto-inject {} 
     } 
    } 
+0

P.S. Все это не сработало из-за ошибок Guice (отсутствует имя ITokenDefProvider). Все еще нужно понять это ... – mvmn

 Смежные вопросы

  • Нет связанных вопросов^_^