3

这是我使用 Xtext 编写的用于实现 DSL 的语法。

grammar org.processing.pde.Pde with org.eclipse.xtext.common.Terminals

generate pde "http://www.processing.org/pde/Pde"

Pde:
    Active | Static;

Active:
    method_1=Setup
    method_2=Draw

;

Static:
    elements+=AbstractElement*
;

AbstractElement:
    Size | Background | Shape | Fill | ShapeMode | Smooth | Stroke | FrameRate | ColorMode

;

terminal LPAREN:
    "("
;

terminal RPAREN:
    ")"
;

terminal MOUSE_X:
    "mouseX"
;

terminal MOUSE_Y:
    "mouseY"
;

terminal P_MOUSE_X:
    "pmouseX"
;

terminal P_MOUSE_Y:
    "pmouseY"
;

terminal NO_VALUE:
    (" ")
;

terminal MODE:
    "CENTER" | "CORNER"
;

terminal OPERATOR:
    "+" | "-" | "/" | "*" | "^"
;

terminal PI_VALUE:
    "PI" |"0" | "HALF_PI" | "QUATER_PI" | "TWO_PI"
;

terminal ROUND_VALUE:
    "ROUND"
;

terminal SQUARE_VALUE:
    "SQUARE"
;

terminal BEVEL_VALUE:
    "BEVEL"
;

terminal CLOSE_VALUE:
    "CLOSE"
;

Corner:
    ROUND_VALUE | BEVEL_VALUE
;

Ending:
    ROUND_VALUE | SQUARE_VALUE
;

PiValuesWithOperations:
    PI_VALUE | PI_VALUE OPERATOR PI_VALUE
;

RadianValue:
    "radian" LPAREN degree_value=INT  RPAREN 
;


GrayValue:
    INT
;

Position_X:
    MOUSE_X| INT | OPERATOR INT | MOUSE_X OPERATOR INT | INT OPERATOR INT | INT OPERATOR MOUSE_X | P_MOUSE_X | P_MOUSE_X OPERATOR MOUSE_X | MOUSE_X OPERATOR P_MOUSE_X | INT OPERATOR P_MOUSE_X | P_MOUSE_X OPERATOR INT
;   

Position_Y:
    MOUSE_Y | INT | OPERATOR INT | MOUSE_Y OPERATOR INT | INT OPERATOR INT | INT OPERATOR MOUSE_Y | P_MOUSE_Y | P_MOUSE_Y OPERATOR MOUSE_Y | MOUSE_Y OPERATOR P_MOUSE_Y | INT OPERATOR P_MOUSE_Y | P_MOUSE_Y OPERATOR INT
;

ColorModeMaxValue:
    INT
;

RedValue:
    INT
;

GreenValue:
    INT
;

BlueValue:
    INT
;

AlphaValue:
    INT
;

HueValue:
    INT
;

SaturationValue:
    INT
;

BrightnessValue:
    INT
;

EndShapeValue:
    CLOSE_VALUE | NO_VALUE
;

Size:
    "size" LPAREN height=INT "," width=INT RPAREN ";"
;

Background:
    "background" LPAREN gray_value=GrayValue RPAREN";"
;

Fill:
    {Fill}
    "fill" LPAREN gray_value=GrayValue RPAREN ";"   

;

ShapeMode:
    "ellipseMode" LPAREN mode_value= MODE RPAREN ";" |
    "rectMode" LPAREN mode_value=MODE RPAREN ";" |
    "beginShape" LPAREN no_begin_shape_value=NO_VALUE RPAREN ";" |
    "endShape" LPAREN no_end_shape_value=EndShapeValue RPAREN ";"
;



Smooth:
    "smooth" LPAREN smooth_value=NO_VALUE RPAREN ";" |
    "noSmooth" LPAREN no_smooth_value=NO_VALUE RPAREN ";"
;

Stroke:
    "stroke" LPAREN stroke_value=INT RPAREN";" |
    "noStroke" LPAREN no_stroke_value=NO_VALUE RPAREN";" |
    "strokeWeight" LPAREN stroke_weight_value=INT RPAREN ";" |
    "strokeJoin" LPAREN stroke_corner=Corner RPAREN";" |
    "strokeCap" LPAREN stroke_ending=Ending RPAREN";"

;

Shape:
    Rectangle | Ellipse | Point | Line | Triangle | Quad | Arc | Vertex
;

Point:
    "point"LPAREN position_x= Position_X"," position_y=Position_Y RPAREN ";"
;

Vertex:
    "vertex" LPAREN position_x=Position_X "," position_y=Position_Y RPAREN ";"
;

Line:
    "line" LPAREN position_1_x=Position_X "," position_1_y=Position_Y "," position_2_x=Position_X "," position_2_y=Position_Y RPAREN ";"
;

Rectangle:
    "rect" LPAREN top_left_x=Position_X "," top_left_y=Position_Y "," bottom_right_x=Position_X"," bottom_right_y=Position_Y RPAREN ";"

;

Ellipse:
    "ellipse" LPAREN center_x=Position_X "," center_y=Position_Y "," width=INT "," height=INT RPAREN ";"
;

Triangle:
    "traingle" LPAREN position_1_x=Position_X "," position_1_y=Position_Y "," position_2_x=Position_X "," position_2_y=Position_Y "," position_3_x=Position_X "," position_3_y=Position_Y RPAREN ";"
;

Quad:
    "quad" LPAREN position_1_x=Position_X "," position_1_y=Position_Y "," position_2_x=Position_X "," position_2_y=Position_Y "," position_3_x=Position_X "," position_3_y=Position_Y "," position_4_x=Position_X "," position_4_y=Position_Y RPAREN ";"
;

Arc:
    "arc" LPAREN position_x=Position_X "," position_y=Position_Y "," width=INT "," height=INT "," start= PiValuesWithOperations "," stop= PiValuesWithOperations RPAREN";" |
    "arc" LPAREN position_x=Position_X "," position_y=Position_Y "," width=INT "," height=INT "," start_r= RadianValue "," stop_r=RadianValue RPAREN";" 

;

FrameRate:
    "frameRate"LPAREN frame_rate_value=INT RPAREN";"
;

ColorMode:
    RGBColorMode | HSBColorMode
;

RGBColorMode:
    "colorMode" LPAREN color_mode="RGB" "," color_mode_max_value=ColorModeMaxValue RPAREN";"
     |"colorMode" LPAREN color_mode="RGB" ","  red_value=RedValue "," green_value=GreenValue "," blue_value=BlueValue ("," alpha_value=AlphaValue)? RPAREN";"

;

HSBColorMode:
    "colorMode" LPAREN color_mode="HSB" "," hue_value=HueValue "," saturation_value=SaturationValue "," brightness_value=BrightnessValue RPAREN";"
;

Setup:
    "void" space=NO_VALUE "setup" LPAREN RPAREN  "{"
        elements+=AbstractElement*
    "}"
;

Draw:
    "void" space=NO_VALUE "draw" LPAREN RPAREN "{"
        shapes+=Shape*
    "}"
;

当我在新的 Eclipse 运行时运行“org.processing.pde”(我的项目)时,它可以帮助我在下面提到的“test.pde”文件中建议代码。这是编程语言“Processing”的语法,我'目前正在使用 Xtext 为该语言构建代码建议。

void setup(){

    size(200,200);

}

void draw(){

    ellipse(50,50,80,80);

}

现在我想根据我的“test.pde”文件生成一个“src-gen/test.java”文件,如下所述,它将充当预编译器代码。

import processing.core.*;


public class Test extends PApplet {

public void setup(){
       size(200,200);
}

public void draw(){
       ellipse(50,50,80,80);
}
   static public void main(String args[]) {
       PApplet.main(new String[] { "--bgcolor=#ECE9D8", "a" });
   }
}

我发现 Xtend 可以为我生成该代码。我浏览了 Xtext 团队在 vimeo 的视频,Xtext 参考文档。我找不到任何其他 Xtend 教程可以继续。我仍然不知道如何开始编写 Xtend 文件。

有人可以帮我开始。

提前致谢。

4

4 回答 4

6

请查看作为 Xtext SDK 一部分的 Statemachine 示例(新项目 -> 示例 -> Xtext ..)。它包含的StatemachineGenerator.xtend类几乎说明了使用 Xtend 生成纯代码的工作原理。

于 2011-11-08T19:27:30.030 回答
2

您可以在 xtext 项目中的“生成器”包中创建一个填充 xtend 文件的生成器。请这个视频可以用福勒书中的一个例子来解释这一点。http://vimeo.com/24584729

于 2011-10-23T16:59:05.843 回答
1

只需 File -> New -> Other 并创建 Xtext 示例项目并查看如何使用 Xtend 在其中生成代码(2?我认为是因为旧的 Xtend 不打算用于代码生成)。

于 2011-08-21T19:08:03.260 回答
0

在您的第一个 Eclipse 实例中,在生成器包内的第一个 xtext 项目中打开名为“yourproject”Generator.xtend 的文件。该文件包含一个名为“doGenerate”的方法,其中包含一个注释部分。您应该在那里生成代码和将在第二个 Eclipse 实例中在您的项目中创建的文件。

于 2022-03-01T11:09:14.053 回答