简体   繁体   English

xtend代码生成从xtext语法调用实体

[英]xtend code generation calling entities from an xtext grammar

I am working on a code generator for my grammar that I have created: 我正在为自己创建的语法开发代码生成器:

Domainmodel:
    (elements+=AbstractElement)*;

PackageDeclaration:
    'package' name=QualifiedName '{'
        (elements+=AbstractElement)*
    '}';

AbstractElement:
    PackageDeclaration | Type | Import;

QualifiedName:
    ID ('-' ID)*;

QualifiedDate:
    INT('-' INT)*
;

Import:
    'import' importedNamespace=QualifiedNameWithWildcard;

QualifiedNameWithWildcard:
    QualifiedName '.*'?;

Type:
     (data+= DataType)* man+=Entity  ;


DataType:
    'tag' name=Tag;

Tag:
    Hobbies='hobbies' | Work= 'work' |Fun='fun'
;

Entity:
    name=Category '{'
       feature+=Feature*
    '}'
    ;
Feature:
    component+=Man(',' component+=Opt)*
;    
enum Category:
    Blog='blog' | Article='articles'
;

Man:
    name='title' '=' type=QualifiedName
 ;

 Opt:
    Tags|Date
 ;

 Tags:
    name='tags' '=' '['type= Tag(','tag+=Tag)*']' 
    |
    name='tags' '=' '[' ']' 
    ;

Date:
    name='date' '=' type=QualifiedDate
    ;

I want my output of my code generator to look like this: 我希望代码生成器的输出如下所示:

---
layout: post
title: "My Trip"
categories: blog
excerpt:
tags: [fun,hobbies]
image:
feature:
date: 2016-06-01T14:19:19-04:00
modified:
---

All I can get right is the static text, I can't seem to call: Category , title , tags , date I've been trying for so long now but I can't seem to get anywhere, I keep getting strange errors which i don't understand 我所能得到的只是静态文本,我似乎无法调用:Category,title,tags,date,我已经尝试了很久了,但是似乎什么也看不到,我不断收到奇怪的错误,我不明白

One of my attempts for just seeing what I can generate is: 我只想看看我能产生什么的尝试之一是:

class MyDslGenerator implements IGenerator2 {

def compile(Entity e) 
{

    '''

    ---
    layout: post
    title: "My Trip"
    categories:«e.name»
    excerpt:
    tags: [fun,hobbies]
    image:
    feature:
    date: 2016-06-01T14:19:19-04:00
    modified:
    ---
    '''
}
override doGenerate(Resource input, IFileSystemAccess2 fsa, IGeneratorContext context) {
    for (e : input.allContents.toIterable.filter(Entity)) {
        fsa.generateFile(
            e.generateName,
            e.compile)
    }
}

when I run the generator I don't get anything replaced by <>. 当我运行生成器时,我什么都不会替换为<>。 I can't seem to figure it out. 我似乎无法弄清楚。

is this a question on how to walk the AST. 这是关于如何走AST的问题。 your grammar and thus the inferred metamodel is quite "bad" to walk so you may have to do something like 您的语法,因此推断出的元模型很难行走,因此您可能需要做类似的事情

title: «(e.feature.head.component.head as Man).type»

so i recommend you to restructure your grammar/AST to fit the stuff you need. 因此,我建议您重组语法/ AST以适应所需的内容。

you can set the encoding for the xtend/xtext plugin like this 您可以像这样设置xtend / xtext插件的编码

tasks.withType(org.xtext.gradle.tasks.XtextGenerate) {
    options.encoding = 'ISO-8859-1'
}

does that help? 有帮助吗?

/**
 * generated by Xtext 2.10.0
 */
package org.xtext.example.mydsl.tests;

import com.google.inject.Inject;
import org.eclipse.xtend2.lib.StringConcatenation;
import org.eclipse.xtext.junit4.InjectWith;
import org.eclipse.xtext.junit4.XtextRunner;
import org.eclipse.xtext.junit4.util.ParseHelper;
import org.eclipse.xtext.xbase.lib.Exceptions;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.xtext.example.mydsl.myDsl.Domainmodel;
import org.xtext.example.mydsl.tests.MyDslInjectorProvider;

@RunWith(XtextRunner.class)
@InjectWith(MyDslInjectorProvider.class)
@SuppressWarnings("all")
public class MyDslParsingTest {
  @Inject
  private ParseHelper<Domainmodel> parseHelper;

  @Test
  public void loadModel() {
    try {
      StringConcatenation _builder = new StringConcatenation();
      _builder.append("Hello Xtext!");
      _builder.newLine();
      final Domainmodel result = this.parseHelper.parse(_builder);
      Assert.assertNotNull(result);
    } catch (Throwable _e) {
      throw Exceptions.sneakyThrow(_e);
    }
  }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM