2011-08-21 3 views
2

이것은 Xtext를 사용하여 DSL을 구현하기 위해 작성한 문법입니다.Xtext와 Xtend를 사용하여 코드를 생성하는 방법은 무엇입니까?

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* 
    "}" 
; 
그것은 나를 내가 새로운 이클립스 runtime.This에서 "org.processing.pde"(내 프로젝트)를 실행하면 아래에 언급 된 "test.pde"파일에서 같은 코드를 제안하는 데 도움이의 구문입니다 수

프로그래밍 언어 "Processing"및 현재 Xtext를 사용하여 언어에 대한 코드 제안을 작성하는 중입니다.

void setup(){ 

    size(200,200); 

} 

void draw(){ 

    ellipse(50,50,80,80); 

} 

는 지금은 아래에 언급 한 바와 같이 내 "test.pde"파일에 따라 "SRC 세대/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 파일을 코딩하는 방법을 알지 못합니다.

누군가 나를 도와 주실 수 있습니까?

미리 감사드립니다.

+0

어떤 Xtext 프레임 워크를 사용하고 있습니까? 1.x 또는 2.x? – Timotei

+0

xtext 2.x입니다. – har

답변

1

그냥 File -> New -> Other로 Xtext 예제 프로젝트를 만들고 Xtend (2?)를 사용하여 코드를 생성하는 방법을 확인하십시오. 이전 Xtend가 코드 생성에 사용되지 않았기 때문에 생각합니다.

1

xtend 프로젝트의 내부에있는 "생성기"패키지 안에 xtend 파일을 작성하는 생성기를 만들 수 있습니다. 이 비디오는 파울러의 책에서 예를 들어 설명 할 수 있습니다. http://vimeo.com/24584729

4

Xtext SDK (새 프로젝트 -> 예 -> Xtext ..)의 일부인 Statemachine 예제를 살펴보십시오. 여기에는 Xtend를 사용하여 일반 코드를 생성하는 방법을 보여주는 # StatemachineGenerator.xtend 클래스가 있습니다.