! "
# ! "
$" " %
#
# &
'" ("& )"
* # ! "
" # *+
",-.
/
&"* 0 &1 2 $
"
$ ") 3",-
)4 & 5
5 ) +*
&"6")( & ") 3"
6 &
",-
& 78
&8 &" 1
9 77
:
#;
#
&<
/ =>8?@ " ?A8=B8B?==
/
&"* 0 &1
2 $
"
$ ") 3",-
)4 & 5
5 ) +*
&"6")(
#
)
-
# &
:
*
") "
&"6")(
&"
",- :
"+&
"
:
BC
*
&
B?==: D
+) "
;
# &
'" ("& )"
* # ! "
" # *+ ",- : + &<
&
:
! "
# ! "
$" "
"
5 &
"
"
")
" )
"
E)
F
"
)( :
"*+
#)"& :
+"&"
"+& ",-
G
"
&*"
"6 ) "
+ )
#
)(
# &
: * B@8==8B??@8
)
/ (")
"&
"3"
&
"
&/
& 78
&8 &" 1
9 77
Nazatto, Thales Eduardo
Desenvolvimento de sistemas orientado a modelos: o
Framework Xtext e sua contextualização no Model-Driven
Development / Thales Eduardo Nazatto. - Rio Claro : [s.n.],
2011
71 f. : il., figs., tabs.
Trabalho de conclusão de curso (bacharelado - Ciências
da Computação) - Universidade Estadual Paulista, Instituto de
Geociências e Ciências Exatas
Orientador: Frank José Affonso
1. Engenharia de software. 2. Programação Orientada a
Aspectos. 3. Domain-Specific Languages. I. Título.
005
N334d
!
"
#$
"
% & %
' & %
(
) '*+
'
,
-
./
0
1 ! ,
#$
2 %!
+
' & %
' +
#$ 3
Comissão Examinadora
Prof. Dr. Frank José Affonso (orientador)
Prof. Dr. Leandro Alves Neves
Prof(a). Dr(a). Maria Cecília V. S. Carneiro
Rio Claro, 12 de dezembro de 2011.
! " #
$
%
$
%
&
'
(
)
*
+
(
,-
.
/
&
,(
.
)
0
,)
. 1
)
-
)
,1
.
1
&
,/
. 2
1
3 ,1
.
" #
/
)
,
.
(
)
$ )
,
45. (
)
,6
. (
%
,(
.
+
(
+
, 7
.
%
$
9+
:
;
8
/
<
=
-
- 7
-:>
8
:
=
<
:
&
>
,&
.
$
>
?
#
&
>
/
<
,& / .
:
>/
'
, /'.
0
+
)
)
#
@ %
$
:
#
A
>
* 8
/
<
-
&
>
+
/
<
8
<
3
3
/
7
<
3
!
- 7
>
-
>-3 2 <
3
<
3
<
3
3
<
1
&
>
,&
.
3
3
3
-
&
>
/
<
,& / . <
3
>/
'
, /'.
B
@ %
3
3
<
<
3
3
< !
C 3<
* /
<
8
>-
&
>
!
"
# $%& ' ( ( '
( !
)* $
+
, !
- .//01
0
. 2 " ''
$'3
45 $
2
2
) '' - .//61
./
7
2
$
& ' ' 2
' )
! 8- .//91
.
# 2 $" ( ' !
$ '
)
" : - .//91
.7
;
8
(!
$'
4< ' 3
*
) /1
.6
6
3
$4 ' $
!
$
" $= "
$
$ ( "=
"
)
1
.0
0 2 " ''
" ( ' 45
' '
$
'( " ' )> "? ! '- @@01
.@
9 2
5 ( 8A (
" $ !
$' 45 )
$ '- .//91
7.
@
$ !
$' 45
! ? $ '( " ' )
$ '- .//91
7.
/ 2
5 ( 8A (
(
5
)
$ '- .//91
77
2
5
! ? $ '( " ' )
$ '- .//91
77
.
'
? 45 BC' "
$'3
45
!
)* $
+
, !
- .//01
70
7
C " &C!
( ! D 8 ) 01
79
#
8
(!
&
.xpt(
D( $
) 91
#/
;
8
(!
45
& ' $ D $
#/
6
8
(! ' (
3 $
(!
' $ D $
#
0
( '
B
! ? $ 3
E F D 8
#.
B !
(
45 $
"I
'"
"I
(
#@
B ! .
(
45 $
"I
'"
"I
( !
"! ('
#@
,
&
* &
>
-&1* - 7
&
1
?&'* ?
&
'
&- * &
- 7
3
)D&* )
D
&
@&B* @&' &
B
@&'* @
& !
'
)B&* )
B
&
B&*
B
&
/&*
/
&
-*
- 7
&
* &
>
/ * /
<
& / * &
>
/
<
/'*
>/
'
1 '* 1
'
/E'* /
E
3 '
--*
-
- 7
- *
>-B 8* >-B
8
" +*
"
+
8& * 8
&
< !
B*
B
860 * 8%
6 ! >0
''* '
> >
'
0+'(*
+
'
(
J
:
'B/+
8 B'?/+( FG8/
H
'B/+
8 + 68' /
I
'B/+
8
6(8JB +?( / 8 /B1' /
K
/?&L(B-
44
4 B0+(- ?FM-
4N
4 4 )
%
&
4N
4 O - 7
4N
4 N 8
4P
O 8/+? - 6B6'B-1(L B)-
4Q
O 4 &
>
,&
.
4Q
O 4 4 &
- 7
3 ,&- .
4Q
O 4 O &
4H
O 4 N &
4I
O 4 P +
4K
O 4 Q
R
O4
O O &
>
,&
.
OO
O O 4 &
>
/
<
,& / .
ON
O O O /
<
,/ .
OP
O N
>/
'
, /'.
OP
O P
-
, - .
OS
O P 4 )
/
OI
O P O
OK
O P N 8
N5
O P P
A
N4
O Q 8
B 8
NP
N - ( &8D-(C @+8@+
NS
N 4 8
&
< ! ,8& .
NS
N O @ %
NH
N O 4 &
D !
< 8
,&D8.
NI
N N @
NK
P &8+- -'-1B
PO
Q 8/+? -
8 ) /-
PQ
Q 4 8
(
PQ
Q O
1
:
8 1
PQ
Q N &
/
PH
Q P 1
)R
PI
Q Q (
8 )
A
PI
S )-0)'?/M-
Q4
I
T0 B)8/
T0 B)8
* (
/
QS
T0 B)8 6* 1
:
1
)R
1
QH
4N
K
D
,
K
8
/
<
4KSI
$
-+ 0
)
" : - .//91
)
=
-- 7
-:>
8
:
=
<
:
,&
. #
$
>
)
R
&
?
#
,& / .
:
, /'.
?
@ %
/' #
R
R
.
L
,
-
7
,&
.
,&
.
@ %
9
;
:
:
:
4P
-A
:
7
8
:
-
O
:
$
:
*
,&
.
,&
.
, /'.
, - .
B 8 8
-
N
>
%
* - @ % 8
$
:
-
P
7
:
-
Q
:
@ %
> >
4Q
.
J
.
M
,
N
)
1
/
'' ).//61
,&
. #
!
"
,-&1.
A
8
#
#
$
R
).//7B1- "
(
! 8 ).//61
+B
#
A
#
A
,
. 6
>
-&1
A
,
.
-
#
<
#
#
R
#
A
)
-&1
<
7
A
,?&' &-
)D&
%
.
A
A
+
7
&
-&1 #
.
L
O )
1
/
" : ).//91
&
#
&- ,
!
#
$
.
>
)
&-
4S
- &-
7
:
?&' +
#
=
#
#
>
#
#
/
>
&-
* $
+ , !
).//01
" : ).//91
-&1
P
* -
,
&5.
U
,
&4.
U
,
&O.
U
>
,
&N.
V
?&'
:
&O
&-
%
)
#
W
A
&-
#
&
4
- &
#
@&B ,
%
&
.
A
- @&B
:
A
)
" : - .//91
8
&- #
=
&
@&B #
4H
!
"
# $%& ' ( ( '
( !
)* $
+
, !
- .//01
.
.
&
N
*
'
&
,)B&.
&
, B&.
, /&. 8
$
A
#
R
R
#
-
'
&
,)B&.
#
#
R
8
%
R
#
A
)B&
8
# =
*
<
#
#
R%
*
4I
-
&
, B&. #
7
&
1
%
?&'
B& #
R
%
R
7
B&
:
R
#
7
R
B&
# 9
;
R
)
$
A
/& 0
:
#
:
)
! 8- .//61
-
, /&.
B&
) '' - .//61
#
7
A
)
,
<
A
<
.
B&
#
A
:
/&
?
/&
/&
7
R
A
:
-
/&
#
R
*
#
7
/&
A
/&
:
R
)
! 8- .//61
.
7
2
)
R
&
#
:
-
#
:
).//
1- "
(
! 8 ).//61
* 9
(
)
*+
&
; 8%
4K
(
$
( '
! P
8
B&
/&
%
#
B&
,
- (
3 D
/
.
/&
(
$
$' Q$" '
! P
8
#
:
:
B&
/&
)
#
/&
B&
.
#
K
#
>
>
#
A
A
#
A
0
#
A
O
O5
. 2 " ''
$'3
45 $
2
2
) '' - .//61
A
! 8 ).//61
-&1
*
2
(
2
P
+
A
2
(
2
P
+
%
X
:
B&
R
2
(
2
P
+
2
(
2
P
+
%
7:
,8
(
.
X
)B&
B&
#
O4
:
$
$
8
/
<
A
/&
R
>
%
:
A
-#
A
=
* ?
>
:
>
N
7
2
$
& ' ' 2
' )
! 8- .//91
.
; 2
2R
+
&
'' ).//61
*
2
B !
P
%
#
A
R
$
(
B !
$
(!
3
'P
X
=
R
=
,8%
* ?
R
"
R
)Y.
R
$
( $ S$"
(!
3
P
)
#
A
OO
R 7
A
2
&
P
)
R
&
9
;
R
/
#
:
:
&
$
#
:
. .
M
,
,
2
)
1
-
,&
. #
8
#
- &
#
%
*
#
,/ .
&
,& / .
&
#
)
! 8- .//61
" : ).//91
A
0
#
, /'.
7
+
#
#
:
A
+
:
)
A
A
ON
# 2 $" ( ' !
$ '
)
" : - .//91
. .
M
,
T
,
2
)
1
/
$ ).//#1- "
(
'' ).//61
& /
#
7
7
O5
8
&
:
7
<
:
2:
&
& /
8
&
& /
#
%
>
#
7
&
<
'' ).//61
*
!
P
8
&
&- & /
B'
45
' '
'P
A
#
&
$
A
#
& /
/'
$"
'P
&
OP
3 '
8
&
#
& /
7
. . .
T
)
1
* $
, !
).//01
#
,/ .
A
,
-
.
)
*(
/
*(
0
*(
*(
! 8 ).//61
/
&
& / *
$
!
P
&
A
?&'
&-
& /
?&'
/'
/
?&'
/'
2 " ''
' $& !&
$
'
'P
& /
/
&
/
& /
#
Z
#
& /
:
:
$
( $ S$"
2!
3
P
& /
&
B&
/&
A
/
X
<
:
:
A
$
2
< '
"I
B
P
& /
&
R
/
A
:
. 7
M 2
)
1
/
@ %
)D 8 - ./
1
, /'.
OQ
-
/' #
1 '
"
A
%
1 ' )
3
"
8
:
%
/'
1 '*
&
1
2 1
3
*(4 5 2
)
)
*
.
/
0
) .
2 )
)
4
2
)
6
6
8
1 '
=
0
#
#
/'
$
8%
/'
*
$
$ 'P
/
7:
%
/'
:
-
7
/'
# %
%
8
$ 'P
/
-
%
/'
>
#
/E'
D !
)61
9
7
-
89
:
&;
<
='
>/
!
$
?/ 1
!
*(
@4 #4 '
4
;
/E' #
/
1
6
,/16
. 9
&
4 @
1
7
(
4 @
0
*(
4 &
OS
;
8
(!
$'
4< ' 3
*
) /1
/'
&
%
R
:
R
?&' #
. # 2
K
2
)
21
!' $- "
(
$ ' ).//91
9
;
8
7!
4KHP
* +
<
A
R
7
6
>
#
*
R
:
7
, --.
R
OH
R
B
R
R
$
$
7
*
>
B
,
#
)
$ '- .//91
)L $ + T $"F- .//#1
.
%
#
7
#
A
R
[ 8
--7
S
+
6
3
$4 ' $
!
$
" $= "
$
$ ( "=
"
)
1
)
$ ' ).//91
#
*
" " '5 P
A
" (!
$ P
2
,
4
3 " !
$
$45 P
&
R
/
:
#
:
(
$
'" ! B !
P
<
9
%
;
#
OI
$
$ Q$" P
&
R
=
#
$ 45
! ? 45
"I
P
:
.
(
)
4
8
4KKH
1
C
9
>-;
,
- .
R
@
%
()
--
)> "? ! '-
@@01
/
L $ + T $"F ).//#1
*(
1
:
:
/
)
4
. #
2
K
?
#
*
$
" ( $ $ 'P
#
:
1 '
%
$
'( " 'P
#
%
%
/
%
#
"
"
X
<
#
B $
'( " 'P
-R
R
R
/
-
#
:
,$
2
' '"
'P
/
:
-OK
. # .
-
$
*
" ( ' 45 P
8
)
$ '- .//91
(!
$ 45 P
R
:
: %
)
$
'-.//91
" ( ' 45 P
X
R
R
,
.
H
#
N
*
0
#
A
R
>
#
R
)> "? ! ' @@01
0 2 " ''
" ( ' 45
' '
$
'( " ' )> "? ! '- @@01
. # 7
N5
'( " P
?
- #
:
--* #
#
> "? ! ' ) @@01
,
#
. #
#
8
:
R
R
X
!
:
2 $ '
L $45 )L $ 2 $ '1P
?
7
#
%
/
A
#
%
%
#
:
%
%
A
/
- #
:
2 $ '
45 )2 $ " '1P
6
#
7
!
#
-
7
#
%
#
R
7
!
)
#
:
A
!
W
#
#
%
A
$ ' )
& " '1P
X
-
)
:
#
#
)
:
: %
4 P 4
#
%3
7
+
$ ' ).//91
*
A
.
N4
*(
1
(
!
*( C
0
1
! 1
,
,
*( =
/
/
>C
0
= )
:
> 1
.
4
. # #
2
-
-R
R
*
$ P
":
#
A
:
:>
-
#
:
2 ' ' S$"
" $ !
$' 4< 'P
?
#
7
A
%
7
#
:>
$
$
$= ).//91
:>
#
%
#
R
#
)
#
7:
%
8
#
A
$
W
A
-
>
"
:
#
>
)
$ ' ).//91
A
,$
)
R 7:
,$
NO
9 2
5 ( 8A (
" $ !
$' 45 )
$ '- .//91
@
$ !
$' 45
! ? $ '( " ' )
$ '- .//91
$ ' ).//91
7
-,
!
.
4
#
-%
#
%
45
44
-NN
/ 2
5 ( 8A (
(
5
)
$ '- .//91
NP
8
- #
4P
. ;
2
- 8
#
B 8
B
8
7
B6&
#
0
O554
R
:>
7
>
"
O55P
:
8
$>
:>
#
B 8
"
B 8 #
\
B
,B
8
.
%
B 8
8
*
8 P
-
%
B 8 #
#
#
8
B 8
8
>
R
+
7
%
A
:>
$
( U P
7
!
:
%
7
)
B 8 #
(
45
"I
P
R
#
7
#
;
#
%
R
:>
NQ
3
45 P
#
R
R
)
#
%
$
7
8
#
7
%
)
#
B 8
B 8
%
%
%
-
8
#
R
8
7: %
-- 8
N H ,
9B
;.
#
A
A
N S ,
92
;. N Q ,
91
;.
N P ,
91
3
;.
-#
,
A
%
.
/
7
7:
O55
7
8
7
#
#
7
7
8
7
* -
" + ,
"
+
.
"
-
@ %
- @ %
7
@
#
NS
7
T
> D
D
0
@ %
7
* - @
)
7
#
R
#
:
7
2
T
> )
1
@ % #
@
#
,8& . - 8& #
8
8&
@
>
R
&-
)
" : - .//91
#
P
:
8& *
EClassEAttribute EReference EDataType
)
7
@
#
- 8&
:
7
A
: O
*
.ecore .genmodel-.ecore
#
@&'
A
.genmodel#
A
:
R
)* $
+ , !
- .//01
4O
NH
.
'
? 45 BC' "
$'3
45
!
)* $
+
, !
- .//01
- @ %
#
.ecore .genmodel=
8
R
7 . D
D
D 8 )./
1
%
@ % #
7
/'
1 '
)
%
%
R
@ %
8
B 8 0
O 5
@ %
A
- @ % #
7
8&
.ecore .genmodel) 01
#
@
@ %
:
)
8
7
R
/'
B
- @ %
:
%
.xtext
8
A
:
R
:
) @1
%
@ %
7
860
:
:
D 8 )./
1
NI
#
R
4N
.xtext:
7:
0
#
grammar with generate:
%
R
A
>
W
A
>
7:
7
C " &C!
( ! D 8 ) 01
7 .
T
>
T
)
T 1
0 @ %
.xtext#
=
-
>
%
:
>
:
@ %
NK
- &D8
@&'
) 91
8
O 5
@ %
&D8*
&D8O
%
R%
)./1
%
:>
/
:
%
Q
&D8O
:
%
: %
@ %
&D8O
:
#
:
@ % #
* - @
7 7 D
/
D 8 )./
1
@
#
<
5
,"J&.
"
%
A
- @
@
R
A
:
@
@
#
8
@
.xpt%
R
,
4P.
@
.xtend#
#
doGenerate8
#
R
@ %
7
#
W
#
generateFileW
:
,
4Q.
R
#
#
:
@ %
#
:>
#
def@
%
%
R
@
:>
P5
#
8
(!
&
.xpt(
D( $
) 91
P4
PO
#
0
O
N
&
&
A
+
#
@ %
7
0
:
* X
^
/
8
@ % #
& /
/'
R
%
:
). 1
#
:
@ %
8
/
<
A
#
4H
0
( '
B
! ? $ 3
E F D 8
4
8
7: #
8
/
<
#
8
#
#
7
:
PN
&
V& /
)B&
#
:
R%
O
:
4
0
@ %
:
@
R
>
%
)
(
8
/
<
:
:
A
:
)
:
:
.xtext
B&
-/&
A
R
>
N #
)
#
:
#
8
A
(
:
R%
-
#
B&
%
R
8
/
<
@ %
7
8
P #
R
R
#
7
8
R
>
)
B&
#
@
/&
>
7
:
R
%
R
X
R
8
#
%
:
@ %
)
8
/
<
#
R
>
R
:
R
$>
@
R
P +
#
)D 8 - ./
1
#
PP
@ %
& /
)
%
7
#
R
,8%* "
)Y.
7
:
:
R
#
#
R
>
:
=
R
$
7
%
#
* J
:
:
+B
$%
%
#
:
:
:>
R
7
@ % #
:
:
PQ
;
0
:
P
8
/
<
7
%
;
2
K
*
8
(
(
$
+
>
$
%
R
-
#
A
#
7
--
(
#
8
/
<
8
>
#
:
:
,
.
A
:
R
; .
,
,
J
:
#
) 01
@ %
)D 8 - ./
1
>
R
-
Tccdsl.xtext>
$
6
*
PS
mapsto
* ?
R
typedefR
package
* ?
0
A
,
typedef.
entity
* ?
0
A
,
typedef.
extends
* ?
functions
* ?
A
7:
voidvoid
* ?
:
,
.
R
:
#
@ %
< !
%
%
.mwe2#
7
#
8
-GenerateTccdsl.mwe2
$
6
#
A
:
@ %
)
@
:
R
8
:
7
"
%
7
,
%
.tcc.
8
7:
#
7:
7
R
8
@ %
:
@
#
:
R
-
TccdslGenerator.xtend$
6
#
#
7
8
#
#
#
doGenerate@
@ %
7
IQualifiedNameProvider#
@Inject
7
V
PH
9
;
:
R
* 8
TccdslGenerator.xtend
#
A
R
>
:
-
R
#
$
6
ModelExtensions.xtend AspectExtensions.xtend ModelExtensions.xtend
TccdslExtensions.xtend
8
=
7
R
:
W
A
-
$
,
%
.
R
:
* X
AppInit
0
AppInit
#
8
#
:
A
8
#
:
A
; 7
#
@ %
:
dsl.tcc
$
6
#
:
=
*
Pessoa:
*
nome idadeA *
cadastrar sortear cadastrar
#
sortear
:
7
tcc.model
#
tcc.model.aspecttcc.model.control app.init
?
#
)
?&'
%
#
PI
R
; #
K
R
R
8
@ %
R
#
R
>
7
)D 8 - ./
1
R
$
6 #
7
"
#
R
,
4K. B
#
#
R
9
;
:
+
#
:
7
@ % #
7
"
A
:
7
"
7
9 G
'H
45
"I
; ;
R
R
& /
R
#
9
R
;
-
+
4
9
=
;
#
,- @ %
#
:
A
. -
R
PK
$
)
B !
(
45 $
"I
'"
"I
(
0
#
#
R
-
R
& /
#
R
R
8
0
7
8
R
>
#
/
+
O
B ! .
(
45 $
"I
'"
"I
( !
"! ('
)
R
N5_
8
2:
! ''
B
HO
Q
S KP
OI
OI
455 55
)
OK
44
NH KN
'( "
OK
OK
455 55
4QI
HN
PS O5
!
! $= '
"I
$= ' V
'
'
2 " $
! $= '
' )W1
!
! $= '
"I
$= ' V
'
'
2 " $
! $= '
' )W1
! ''
B
HO
Q
S KP
OI
4H
S5 H4
)
OK
N
45 NP
'( "
OK
N
45 NP
4QI
OI
4H HO
!
! $= '
"I
$= ' V
'
'
2 " $
! $= '
' )W1
!
! $= '
"I
$= ' V
'
'
2 " $
Q5
8
7
B 8
8
8
#
R
%
:
:>
:>
)
& /
#
#
V
#
/'
A
#
R
:
/'
+
N
B ! 7
$= '
"I
(!
$
' (
45
"I
PS O_
R
R
& /
7
7
#
:
7
=
)
:
& D 8
$= ' "
'
+
% %
NH
! '' D $
$= ' "
'
+
1
SQ
+
8%
HN
&
8%
PI
8%
NK
)
8%
NO
Q4
6
K
)
@ %
#
:
/
/'
R
& /
/
- @ %
8
#
%
:
#%
V
:
V
W
:
/'
-
-A
=
&
&
& /
8
/
<
:
)
:
#
R
#
:
8
@ %
&
7
:
R
#
A
+
#
:
:
+
#
#
/
R
:
R
7
@ %
QO
)
:
%
#
A
A
/
#
A
#
QN
0
X
) 1
'?)(8 B-
?
<
"
VO55K
:
4K>N5
NP>Q5
*
`
*VV<<<
V
V
VQQVQQ4NPV
>5O5KO55K>4P5QNNV >
a
).1
E?B0+8(-
& (
J ' 8(( &
" +
?
>
+
B
(
&
8
0
+
)
/
4SN ,O55H. OKZ
PN
'
)
/3
> ?
3
/
> /
/
:
OK>N4
* `
*VV<<<
V
V
V
V/4QH45SS45H554PSSa
)71
B//
'
J 0
B
? :
&
1
:
)R
:
N H>OK
*
`
*VV<<<
V
V
V4IPNV/'6/>S@b 0ca
)#1
68'B@ " # 8 ?
&
*
?&'
A
#>
:
OQ>PP
*
`
*VV<<<
V
V
VNVN4P4V
>
445QO55S>4SQQPIV >
a
);1
@ %
:
NH>NI
`
*VV<<<
V@ % V
Va
)61
/E'
* `
*VV
< !
V< ! V/E'a
* OP
O544
)01
*
`
*VV
< !
V< ! V
d
d
dB
a
* 44
O544
)91
8
,
<
.
* `
*VV
< !
V< ! V8
d_OIB 8_OKa
* 44
O544
)@1
8
Z
* `
*VV<<<
a
* 44
O544
) /1
&
/E'
/
O55I*
3
*
QP
O544
)
1
- e +
/
7
* `
*VV!
< !
VO55HV5NVOHV
>
>
>
7
V
a
* OS
O544
) .1
/ 0+-/
2
C
(
-
*
`
*VV
V V
V
<
V
a
) 71
DB0)C
"?0B-( J
1
/
-"
"
* `
*VV
Vf
V< !
V
V
d
a
) #1
CB)c '8/
1
>-
*
`
*VV<<<O
V
V
V
V
V
VC
>8)-- KHV
a
) ;1
)-?+B02-
)
2
" > 1
A
455_
*
`
*VV<<<
V
V
> >
7>
>
>
>
>455>
Va
) 61
CB)c '8/ 1
2 008& 0 "
B
"
"
* `
*VV<<<
V
V
V
VO55OV
5O>
a
) 01
(B8/8
1
<
@ %
* `
*VV<<<
V
>
><
>% % Va
* 5I
O544
) 91
(B8/8
1
<
@ %
O
*
`
*VV<<<
V
>
><
>% % >
>OVa
* 5I
O544
) @1
8 +B018
/
8%
<
@ %
*
`
*VV
VO545V5IV
> %
><
>% %
a
* 5I
O544
)./1
&D8O
* `
*VV<<<
V@ % V
VOd4d5V44I> < >
>
a
5K
O544
). 1
8 +B018 /
& /
/'
* `
*VV
VO55IV5HV
>
>
QS
2X
P
*
(
*
5 *6&
B?==
*" +"&" "
5
6" "*
G &
"*
+
" +"&" *
&
6&
:
&"
5 "
* *
*" &
5
8
*"
5 "
" * & & )" H&
) " +"&"
"&I &
7 &*" 5 8
!"
#"
=8
* *
+,J
5 &I "+"& & "
"&
*"
" 5 3 "+H
*" 7
") "
&
" $ ,-
) < "8
=8
*"
5 + &* & "
)
-
+
"
*":
G
" & 6
/
*
"
8
=8
*"
5 + &* & " *+&
-
" " +
" +&
*"8
B8
*"
5 + &* & " *+&
-
*" +
" ") " H& "8
!"
#"
QH
2X
P
J
-
R
C "
! $
Tccdsl.xtext
*
grammar org.xtext.tcc.Tccdsl with org.eclipse.xtext.common.Terminals
generate tccdsl "http://www.xtext.org/tcc/Tccdsl"
Model:
(types+=Type)*;
Type:
Package | TypeDef | Entity;
Package:
"package" name=JAVAID "{"
(types+=Type)* "}";
TypeDef:
"typedef" name=ID ("mapsto" mappedType=JAVAID)?;
JAVAID:
ID("." ID)*;
Entity:
"entity" name=ID ("extends" superEntity=[Entity])? "{"
(attributes+=Attribute)* ("functions"
"{"
(functions+=Function)* "}")?
"}";
Attribute:
type=[Type] (many?="*")? name=ID;
Function:
QI
GenerateTccdsl.mwe2*
module org.xtext.tcc.GenerateTccdsl import org.eclipse.emf.mwe.utils.* import org.eclipse.xtext.generator.* import org.eclipse.xtext.ui.generator.*var grammarURI = "classpath:/org/xtext/tcc/Tccdsl.xtext" var file.extensions = "tcc"
var projectName = "org.xtext.tcc.dsl" var runtimeProject = "../${projectName}"
Workflow {
bean = StandaloneSetup { scanClassPath = true
platformUri = "${runtimeProject}/.." }
component = DirectoryCleaner {
directory = "${runtimeProject}/src-gen" }
component = DirectoryCleaner {
directory = "${runtimeProject}.ui/src-gen" }
component = Generator {
pathRtProject = runtimeProject
pathUiProject = "${runtimeProject}.ui" pathTestProject = "${runtimeProject}.tests" projectNameRt = projectName
projectNameUi = "${projectName}.ui" language = {
uri = grammarURI
fileExtensions = file.extensions
// Java API to access grammar elements (required by several other fragments)
fragment = grammarAccess.GrammarAccessFragment {}
// generates Java API for the generated EPackages
fragment = ecore.EcoreGeneratorFragment { // referencedGenModels = "
// platform:/resource/org.eclipse.xtext.xbase/model/Xbase.genmodel, // platform:/resource/org.eclipse.xtext.common.types/model/JavaVMTypes.g enmodel // " }
// Serializer 2.0
fragment = serializer.SerializerFragment {}
// the serialization component (1.0)
// fragment =
QK
// a custom ResourceFactory for use with EMF
fragment = resourceFactory.ResourceFactoryFragment { fileExtensions = file.extensions
}
// The antlr parser generator fragment.
fragment = parser.antlr.XtextAntlrGeneratorFragment { // options = {
// backtrack = true
// }
}
// java-based API for validation
fragment = validation.JavaValidatorFragment { composedCheck =
"org.eclipse.xtext.validation.ImportUriValidator" composedCheck =
"org.eclipse.xtext.validation.NamesAreUniqueValidator" }
// scoping and exporting API
// fragment = scoping.ImportURIScopingFragment {}
// fragment = exporting.SimpleNamesFragment {}
// scoping and exporting API
fragment = scoping.ImportNamespacesScopingFragment {} fragment = exporting.QualifiedNamesFragment {}
fragment = builder.BuilderIntegrationFragment {}
// generator API
fragment = generator.GeneratorFragment { generateMwe = true
generateJavaMain = true }
// formatter API
fragment = formatting.FormatterFragment {}
// labeling API
fragment = labeling.LabelProviderFragment {}
// outline API
fragment = outline.OutlineTreeProviderFragment {} fragment = outline.QuickOutlineFragment {}
// quickfix API
fragment = quickfix.QuickfixProviderFragment {}
// content assist API
fragment = contentAssist.JavaBasedContentAssistFragment {}
S5
'
)
TccdslExtensions.xtend*
fragment = parser.antlr.XtextAntlrUiGeneratorFragment {}
// generates junit test support classes into Generator#pathTestProject
fragment = junit.Junit4Fragment {}
// project wizard (optional)
// fragment = projectWizard.SimpleProjectWizardFragment {
// generatorProjectName = "${projectName}"
// modelFileExtension = file.extensions
// }
// provides the necessary bindings for java types integration
fragment = types.TypesGeneratorFragment {}
// generates the required bindings only if the grammar inherits from Xbase
fragment = xbase.XbaseGeneratorFragment {}
// provides a preference page for template proposals
fragment = templates.CodetemplatesGeneratorFragment {}
// rename refactoring
fragment = refactoring.RefactorElementNameFragment {}
// provides a compare view
fragment = compare.CompareFragment { fileExtensions = file.extensions
} } } } package org.xtext.tcc import org.eclipse.emf.ecore.EObject import org.eclipse.xtext.common.types.JvmDeclaredType import org.xtext.tcc.tccdsl.*
class TccdslExtensions {
def String packageName(Object o) { switch(o) {
Package : concatPath(packageName(o.eContainer), o.name) EObject : packageName(o.eContainer)
JvmDeclaredType : o.packageName default: null
} }
S4
suffix else
prefix + "." + suffix }
def functionHeader(Function f)'''«IF f.type == null»void«ELSE»«typeDeclaration(f)»«ENDIF»
«f.name»(«parameters(f)»)'''
def typeDeclaration(Attribute a)'''«IF
a.many»List<«a.type.name»>«ELSE»«a.type.name»«ENDIF»'''
def typeDeclaration(Function f)'''«IF
f.many»List<«f.type.name»>«ELSE»«f.type.name»«ENDIF»'''
def variable(Attribute a)'''«typeDeclaration(a)» «a.name»'''
def aspectParameters(Function f){ var pars = ""
var i = 0
for(p:f.parameters){
pars = pars + typeDeclaration(p).toString i = i + 1
if(i < f.parameters.size){ pars = pars + ", " }
}
pars }
def parameters(Function f){ var pars = ""
var i = 0
for(p:f.parameters){
pars = pars + variable(p).toString i = i + 1
if(i < f.parameters.size){ pars = pars + ", " }
}
pars }
def parameterDeclaration(Function f){ var pardecl = ""
var i = 0
for(p:f.parameters){
pardecl = pardecl + p.name i = i + 1
if(i < f.parameters.size){ pardecl = pardecl + ", " }
}
pardecl }
SO
)
AspectExtensions.xtend*
package org.xtext.tcc.generator import org.xtext.tcc.TccdslExtensions import org.xtext.tcc.tccdsl.* import org.eclipse.xtext.naming.IQualifiedNameProvider import org.eclipse.xtext.common.types.JvmDeclaredType import com.google.inject.Inject
class AspectExtensions extends TccdslExtensions {
@Inject extension IQualifiedNameProvider nameProvider
def aspect(Entity e)'''
«IF e.eContainer instanceof Package» package «e.packageName».aspect; «ELSE» package aspect; «ENDIF» import java.util.List; import «e.fullyQualifiedName»;
public aspect Aspecto«e.name.toFirstUpper»{ «FOR f:e.functions»
pointcut metodo«f.name.toFirstUpper»(): call (*
«e.packageName».control.«e.name.toFirstUpper»Controller.«f.name»(..)) ;
pointcut metodo«f.name.toFirstUpper»2(): call (public static «IF f.type != null»«f.type.name»«ELSE»void«ENDIF»
«e.packageName».control.«e.name.toFirstUpper»Controller.«f.name»(«asp ectParameters(f)»));
«ENDFOR»
«FOR f:e.functions»
before(): metodo«f.name.toFirstUpper»(){
System.out.println(thisJoinPoint.getSignature() + " - Conectou!");
}
after() returning: metodo«f.name.toFirstUpper»2(){
SN
)
ModelExtensions.xtend*
package org.xtext.tcc.generator
import org.xtext.tcc.TccdslExtensions import org.xtext.tcc.tccdsl.*
import org.eclipse.xtext.naming.IQualifiedNameProvider import com.google.inject.Inject
class ModelExtensions extends TccdslExtensions { def compile(Entity e) '''
«IF e.eContainer instanceof Package» package «e.packageName»;
«ENDIF»
import java.util.List;
«IF e.eContainer instanceof Package»
import «e.packageName».control.«e.name»Controller; «ELSE» import control.«e.name»Controller; «ENDIF» «classes(e)» '''
def classes(Entity e)'''
public class «e.name»«IF e.superEntity != null» extends «e.superEntity.name»«ENDIF»{
«FOR a:e.attributes» private «variable(a)»; «ENDFOR»
«FOR a:e.attributes»
public «typeDeclaration(a)» get«a.name.toFirstUpper»(){ return «a.name»;
}
public void set«a.name.toFirstUpper»(«variable(a)»){ this.«a.name» = «a.name»;
}
«ENDFOR»
«FOR f:e.functions»
public «functionHeader(f)»{ «IF f.type != null»return
SP
)
ControllerExtensions.xtend*
)
TccdslGenerator.xtend*
/*
* generated by Xtext */
package org.xtext.tcc.generator
import org.eclipse.emf.ecore.resource.Resource import org.eclipse.xtext.generator.IGenerator
import org.eclipse.xtext.generator.IFileSystemAccess
import static extension
org.eclipse.xtext.xtend2.lib.ResourceExtensions.* import org.xtext.tcc.tccdsl.*
import org.eclipse.xtext.naming.IQualifiedNameProvider import com.google.inject.Inject
class TccdslGenerator implements IGenerator {
@Inject extension IQualifiedNameProvider nameProvider
@Inject extension ModelExtensions models package org.xtext.tcc.generator import org.xtext.tcc.TccdslExtensions import org.xtext.tcc.tccdsl.* import org.eclipse.xtext.naming.IQualifiedNameProvider import org.eclipse.xtext.common.types.JvmDeclaredType import com.google.inject.Inject
class ControllerExtensions extends TccdslExtensions {
@Inject extension IQualifiedNameProvider nameProvider
def control(Entity e)'''
«IF e.eContainer instanceof Package» package «e.packageName».control; «ELSE» package control; «ENDIF» import java.util.List; import «e.fullyQualifiedName»;
public class «e.name.toFirstUpper»Controller{ «FOR f:e.functions»
public static «functionHeader(f)»{
}
«ENDFOR» }