首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XText中的自定义终端

XText中的自定义终端
EN

Stack Overflow用户
提问于 2014-11-11 02:07:00
回答 2查看 1.5K关注 0票数 1

我最近开始学习XText,并尝试做一件简单的事情--有一个自定义的终端定义,而不是导入org.eclipse.xtext.common.Terminals

首先,我通过x.mvmn.blah.xtext包中的向导创建了BlahLang.xtest。

然后我检查了教程并做了两件事: a)在xtext文件所在的包中创建了自定义终端文件。即x.mvmn.blah.xtext中的Test.xtext。

该文件的内容与Terminals.xtext中的内容相同,但使用了正确的包声明:

代码语言:javascript
复制
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:
    .;

b)在我的BlahLang.xtext文件中,我通过'with‘声明导入了该文件,而不是向导放在那里的org.eclipse.xtext.common.Terminals

代码语言:javascript
复制
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生成的文件引用了不存在的类:

代码语言:javascript
复制
x.mvmn.blah.xtext.services.TestGrammarAccess
x.mvmn.blah.xtext.TestStandaloneSetup
x.mvmn.blah.xtext.validation.TestValidator

我尝试了不同的变通方法(在Test.xtext中添加"generate“等),但都不起作用。我几乎被卡住了,根本不知道哪里出了问题,也不知道我该如何修复。

请帮帮忙。

EN

回答 2

Stack Overflow用户

发布于 2014-11-11 15:23:42

听起来你没有为你的终端语法生成适当的基础设施。您可能希望采用与Xtext的common.Terminals相同的生成器配置。

代码语言:javascript
复制
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 {}
    }
}
票数 2
EN

Stack Overflow用户

发布于 2014-11-12 21:27:14

多亏了塞巴斯蒂安的建议,我终于设法让XText生成的代码不会显示编译错误,方法是将这个生成器组件添加到我的GenerateBlahLang.mwe2中(大部分是从现有的生成器复制过来的,有些部分被注释掉了,因为在生成过程中出现了错误“如果没有产生式规则,您可能无法为语法生成ANTLR解析器”):

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26850096

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档