Title: Grammar-Driven Generation of Domain-Specific Language Testing Tools Using Aspects
1Grammar-Driven Generation of Domain-Specific
Language Testing Tools Using Aspects
Advisor Dr. Jeff Gray Thesis Committee Dr.
Barrett Bryant Dr. Brian Toone Dr. Chengcui
Zhang Dr. Marjan Mernik Dr. Mikhail Auguston
Ph.D. Defense Hui Wu wuh_at_cis.uab.edu http//www.ci
s.uab.edu/wuh 10/29/2007
2Overview of Presentation
Eclipse PDE
Motivation
Background
Testing support for DSLs
Domain-SpecificLanguages
Research Goals
Raise AOP to a higher level of abstraction
My Approach
Generative Programming
Evaluation
2
Experimental Evaluation and Generality Analysis
AOP
3Categories of DSL End-Users
Spreadsheet
Admin Assistants
Business Query Systems
Business Person
Modeling Language
Auto Factory Worker
DSL for Physics
Scientist
3
4The Benefits of Using DSLs
- Case studies and empirical evaluations documented
in the research literature have identified the
following benefits of DSLs - DSLs can hide the lower level programming
language details from end-user programmers - DSLs assist in software maintenance whereby
end-users can directly use the DSLs to make
required routine modifications - DSLs assist end-users in writing more concise,
descriptive, and platform independent programs - The use of DSLs increases flexibility,
productivity, reliability, and usability shorten
the application development time and reduce the
development cost significantly
5Motivation of Proposed Research
Editor
Compiler
Domain Experts program at DSL level
Domain Experts deal with GPL
Visualizer
Debugger
Profiler
DSL translated into General Purpose Language
(GPL)
Integrated Development Environment (IDE)
Domain Experts deal with DSL
5
6Mismatch Between Abstraction Levels
Generated Java Parser Code
ANTLR Grammar
. public final void commands() throws
RecognitionException, TokenStreamException try
// for error handling
switch ( LA(1)) case
CALL case INIT case SET
case PRINT command()
commands() break
case END
break default
throw new NoViableAltException(LT(1),
getFilename()) public final void
function_name() throws RecognitionException,
TokenStreamException try // for
error handling switch
( LA(1)) case RIGHT
match(RIGHT)
fileio.print(" //move right")
fileio.print(" move_right()")
fileio.print(" ")
break
case LEFT
match(LEFT)
sllinenumberdsllinenumber1
fileio.print(" //move left")
fileio.print(" move_left()")
fileio.print(" ")
break
. commands ( ccommand cscommands
) command ( RIGHT
fileio.print("//move right")
fileio.print("xx1")
fileio.print("timetime1")
fileio.print(" ") LEFT
fileio.print("//move left")
fileio.print("xx-1")
fileio.print("timetime1")
fileio.print(" ")
6
7Research Goal
- A Matrix of DSL Testing Tools
- Generalized approach to automatically produce a
software product line of DSL testing tools from
DSL grammars
Imperative DSL Debugger
Declarative DSL Debugger
Hybrid DSL Debugger
AspectG
Imperative DSL Test Engine
Declarative DSL Test Engine
Hybrid DSL Test Engine
Imperative DSL Profiler
Declarative DSL Profiler
Hybrid DSL Profiler
Future Work after PhD
8Outline
- Background
- DSL Debugging Framework (DDF)
- DSL Unit Testing Framework (DUTF)
- AspectG
- Future Work and Conclusion
9Different Types of Debuggers
- Categorized by Zellweger, 1984 based on
behavior of a debugger - expected behavior debugger
- truthful behavior debugger
- Categorized by Auguston, 1998 based on the
behavioral models of higher level debugging
mechanisms - algorithmic debugger
- declarative debugger
- event-based debugger
- The work in this dissertation represents expected
behavior debuggers that perform typical debugging
tasks on DSL programs
10Categories of Domain-Specific Languages
- Imperative DSL
- Robot DSL
- Declarative DSL
- Feature Description Language (FDL)
- BackusNaur Form (BNF) language syntax
specification - Hybrid DSL
- Swing User-interface Language (SWUL)
- Hybrid Robot DSL
10
11Categories of Domain-Specific Languages
- Imperative DSL Centered around assignment
expressions or control flow statements - Robot Language
-
- 17 Down
- 18 position(0,-1)
- Down
-
- 21 Init position(0,0)
- 22 Call left
- 23 Call down
- 24 Call knight
- 25 Set position(5,6)
- 26 Call up
- 27 Call right
- 28 Print position
11
12Categories of Domain-Specific Languages
- Declarative DSL declares the relationship
between inputs and outputs - Feature Description Language (FDL)
1 Car all (Carbody, Transmission, Engine,
Horsepower, opt(pullsTrailer)) 2 Transmission
oneof (automatic, manual) 3 Engine moreof
(electric, gasoline) 4 Horsepower oneof
(lowPower, mediumPower, highPower) 5 include
pullsTrailer 6 pullsTrailer requires highPower
- BackusNaur Form (BNF) language syntax
- specification a set of derivation rules
-
START begin COMMANDS end COMMANDS
COMMAND COMMANDS epsilon COMMAND
left right up down
12
13Categories of Domain-Specific Languages
- Hybrid DSL embedded GPL code within the DSL
description (Robot)
Random String answer int max
JOptionPane myGUI new JOptionPane() Random
rand new Random() answer
myGUI.showInputDialog("Generate a random number
for X-axis between 1 and ") max
Integer.parseInt(answer) x
rand.nextInt(max) answer
myGUI.showInputDialog("Generate a random number
for Y-axis between 1 and ") max
Integer.parseInt(answer) y
rand.nextInt(max) myGUI.showMessageDialog(nul
l, "Generated Position(" x "," y ")")
Random Init position(0,0) Call left
Call down Call knight Set position(5,6)
Call up Call random Call right Print
position
13
14Categories of Domain-Specific Languages
- Hybrid DSL embedded DSL description (SWUL)
within the GPL code
import javax.swing. import java.awt.
public class WelcomeSwing public static void
main(String ps) JFrame frame frame
title "Welcome!" content panel of
border layout center label text
"Hello World" south panel of grid
layout row button
text "cancel"
button text "ok"
frame.pack() frame.setVisible(true)
14
15Eclipse Plug-In Based Software Development
- Eclipse Debug Perspective
a) Variable Inspector
b) Navigation Toolbar
15
16Program Transformation with the Design
Maintenance System
- Design Maintenance System (DMS) is a
transformation and re-engineering toolkit
developed by Semantic Designs - Provides lower level transformation functions
such as parsing, AST generation and manipulation,
pretty printing, powerful pattern matching, and
source translation capabilities - Pre-constructed domains for several dozen GPLs
(e.g., Java, C, and Object Pascal) - This research required the creation of a new
domain for ANTLR
16
17Overview of my Approach
Syntax-Directed Translation
Plug-In Based Software Development
ANTLR
Eclipse
public class Robot x0 y0 time0
//move left move_left()
Design Patterns
Generative Programming
Model-View-Controller Adapter Pattern
pointcut productions() within(command.)
before() productions() dsllinenumberdsllinen
umber1
Aspect-Oriented Programming on DSL Grammars
AspectG
17
18Outline
- Background
- DSL Debugging Framework (DDF)
- DSL Unit Testing Framework (DUTF)
- AspectG
- Future Work and Conclusion
19DSL Debugging Framework (DDF)
19
20Process of DSL Debugger Generation
Robot DSL corresponding GPL code generated in
Java
DSL grammar is defined using ANTLR Notation
DSL is the input of the Lexer and Parser
generated by ANTLR
Additional Mapping code generated in Java
DSL translation process
Corresponding GPL and Mapping Code are inputs of
Mapping component
Eclipse Debugging perspective communicates with
mapping component
jdb communicates with mapping component
20
21Source Code Mapping
3 knight 4 position(0,1) 5 position(0,1) 6 position(1,0) 7 knight 8 9 Init position(0,0) 10 left 11 down 12 knight 13 Set position(5,6) 14 up 15 right 16 Print position 6 public static void move_knight() 7 xx0 8 yy1 9 xx0 10 yy1 11 xx1 12 yy0 13 public static void main(String args) 14 x0 15 y0 18 move_knight() 20 x 5 21 y 6 26 System.out.println("x coordinate"x"" 27 "y coordinate " y)
13, "Robot.java", 20, 21, "main", "none"
21
22Debugging Methods Mapping
Mapping DSL GPL
Source Code n_i maps to m_i to m_j Line Number n_1 n_2 n_... n_i n_i1 n_... n_j n_j1 n_... Line Number m_1 m_2 m_... m_i m_i1 m_... m_j m_j1 m_...
Breakpoint Set breakpoint at n_i Set breakpoint at m_i
Step Over Step over line at n_i Step Over algorithm
Step Into Step into line at n_i Step Into algorithm
Terminate Terminate at line n_i Terminate at line m_i
Resume Resume at line n_i Resume at line m_i
22
23DSL Debugging Step Over Algorithm
1 if (function name equals main) 2 if (dsl_line_number lt last line number of DSL code) 3 set breakpoint at gpl_line_number corresponding to dsl_line_number1 4 call cont() 5 6 else 7 call cont() 8 step over last line of DSL code, debugging session terminated 9 10 current dsl_line_number increased by one 11 12 else 13 get function_type from mapping information base 14 if (function_type equals "functionbody") 15 current dsl_line_number increased by one 16 for all the statements corresponding to this one line of DSL code 17 call step() 18 19 else if (function_type equals "functionend") 20 call step() 21 assign current dsl_line_number as previous_dsl_line_number 1 22 23
23
24Debugging Results Mapping
1 INIT varVARIABLES LPAREN init_num1NUMBER COMMA init_num2NUMBER RPAREN 2 3 dsllinenumberdsllinenumber1 4 fileio.print("x"init_num1.getText()"") 5 fileresult.print("x_coordinateprint x") 6 gplbeginlinefileio.getLinenumber() 7 fileio.print("y"init_num2.getText()"") 8 fileresult.print("y_coordinateprint y") 9 fileio.print("time0""") 10 gplendlinefileio.getLinenumber() 11 filemap.print("mapping.add(new Map("dsllinenumber",\"Robot.java\"," 12 gplbeginline ","gplendline",""\""funcname"\""",""\""funcall"\"""))") 13 fileresult.print(variablevar.getText()"(x_coordinate,y_coordinate)") 14
Black Basic functionality Blue Source code
mapping Red Debugging results mapping
24
25Generated DSL Debuggers
25
26Imperative DSL Debugger
26
27Declarative DSL (FDL) Debugger
27
28Declarative DSL (BNF) Debugger Version 1
28
29Declarative DSL (BNF) Debugger Version 2
29
30Hybrid Robot Debugger (Java embedded in DSL)
30
31Hybrid SWUL Debugger (DSL embedded in Java)
31
32Hybrid SWUL Debugger Video Demo
- There are 7 sets of demos in 3 different video
formats - Available at
- www.cis.uab.edu/wuh/ddf/demos.html
33Generality Analysis of DDF
- 19 software components 3,429 lines of code can
be reused
DSL Category DSL Name Number of Specific Functions or Classes Customized Lines of Code
Imperative DSL Robot Language 2 69
Declarative DSL FDL 3 89
Declarative DSL BNF 5 261
Hybrid DSL Hybrid Robot Language 4 117
Hybrid DSL SWUL 5 152
33
34JDB, GDB, and Cordbg Basic Debugging Commands
Comparison
Debugging Actions JDB (Java) GDB (C) Cordbg (C)
Set a Breakpoint stop at class line number break filenamelinenumber break file line number class function offset
Step Over step step count next count
Display Value print class.staticfield print expr print variable name
Terminate Exit quit Exit
Resume cont continue ignore-count cont count
34
35Related Work in the Area of Domain-Specific
Language Debuggers
- Khepera
- Support optimization code debugger store
transformation information in a database - Execution time and cost are high
- JSR-045
- Establishes standardized debugging tools for
correlating Java bytecode to the source code of
languages other than Java - Does not have a debugging result mapping process
- ANTLR Studio
- An example of a hybrid debugger
- Based on the JSR-045 mapping mechanism
- Display only Java variable values
- TIDE
- Although uses gdb, TIDE requires the end-user to
understand a precise language specification in
ASFSDF - Knowledge of the rewrite rules in the built-in
library is required to construct a debugger for a
new language
35
36Outline
- Background
- DSL Debugging Framework (DDF)
- DSL Unit Testing Framework (DUTF)
- AspectG
- Future Work and Conclusion
37DSL Application Software Errors!
- Before locating software errors how do we know
there are bugs inside a DSL application?
38DSL Unit Testing Framework (DUTF)
- Complement to the DDF the DUTF assists in
identifying the presence of errors and the DDF
assists in isolating the specific location of the
error - Architecture and process of construction is
similar to the DSL Debugging Framework (DDF)
architecture
38
39DSL Unit Testing Framework (DUTF)
39
40DSL Unit Testing Framework (DUTF)
Robot DSL Unit Test Case 1 TestCase testknight 2 Init position(0,0) 3 Expectedposition(1,2) 4 knight 5 AssertEqual (Expectedposition, position) 6 GPL Unit Test Case (JUnit) 11 public void testkinght() 12 robot.x 0 13 robot.y 0 14 int x1 15 int y2 16 robot.move_knight() 17 assertEquals(x, robot.x) 18 assertEquals(y, robot.y) 19
1, TestRobot.java,11,testknight
40
41DSL Unit Testing Framework (DUTF)
Car FDL Unit Test Case 1 TestCase testFeatures 2 Expectedfeature(carbody, manual, highPower) 3 use Car.FDL(All) 4 Constraint C1 include pullsTrailer 5 AssertTrue(contain(Expectedfeature, feature)) 6 AssertEqual(6, numberof feature) 7
GPL Unit Test Case (JUnit) 11 public void testFeatures () 12 testFeatures.add("carbody") 13 testFeatures.add("manual") 14 testFeatures.add("highPower") 27 assertTrue(compareFeatures(testFeatures,parse(fc,root,cons))) 28 assertEquals(6,getFeatureListNumber(parse(fc,root,cons)))
41
42DSL Unit Testing Framework (DUTF)Robot Language
Unit Test Engine
42
43DSL Unit Testing Framework (DUTF)FDL Unit Test
Engine
43
44Generality Analysis on DUTF
- Among 22 software components in DUTF, there are
3,001 lines of code that are generalized and
reused to generate the different DSL unit test
engines.
DSL Category DSL Name Number of Specific Functions or Classes Customized Lines of Code
Imperative DSL Robot Language 2 239
Declarative DSL FDL 4 482
44
45JUnit and NUnit Basic Unit Test Actions
Comparison
Unit Test Actions JUnit (Java) NUnit (.Net languages)
Equality Assertion assertEquals(expected, actual) Assert.AreEqual(expected, actual)
Condition Test assertTrue(actual) Assert.IsTrue(actual)
Condition Test assertFalse(actual) Assert.IsFalse(actual)
Condition Test assertNull(actual) Assert.IsNull(actual)
Utility Method fail() Assert.Fail()
Identity Assert assertSame(expected, actual) Assert.AreSame(expected, actual)
45
46Related Works in the Area ofDomain-Specific
Language Tools
- ASFSDF
- Generate program analysis and transformation
tools, and produce software renovation tools - The unit testing tool support has not been
reported - JST
- Complicated mechanism (e.g., Language extension)
- Does not focus on language tools generation
- LISA
- Can generate editor, parser, and visualizer for
new languages - Debugger, test engine, and profiler are not the
target language tools, LISA can be used as the
front-end of our framework - SmartTools
- Base on Java and XML technologies
- Debugger, test engine, and profiler are not
target language tools - Other Related Testing Tools
- Parameterized unit testing
- Testing grammar-driven functionality
- Generating unit tests using symbolic execution
- Generating test inputs of AspectJ programs
46
47Outline
- Background
- DSL Debugging Framework (DDF)
- DSL Unit Testing Framework (DUTF)
- AspectG
- Future Work and Conclusion
48Crosscutting Concerns in Tool Generation Process
Crosscutting concerns observed in DSL grammars
during the generation of DSL debuggers and unit
test engines How do we address such concerns in
DSL grammars?
48
49AspectG
- Crosscutting concerns emerge in different
software artifacts (e.g., model, grammar, and
source code) - AspectG A domain-specific aspect language for
language grammars written in ANTLR
49
50Addition of Debugging Support A Crosscutting
Grammar Concern
Base Grammar
command ( RIGHT fileio.print(" //
move right") fileio.print(" xx1") filei
o.print(" timetime1") fileio.print("
") LEFT fileio.print("
//move left") fileio.print(" xx-1") file
io.print(" timetime1") fileio.print("
")
What if this line changes?
Change here
Duplicate Debugging Aspect Code
dsllinenumberdsllinenumber1 gplbeginlinefil
eio.getLinenumber() gplendlinefileio.getLinenum
ber() filemap.print(" mapping.add(new
Map("dsllinenumber", \"Robot.java\","gplbeginli
ne","gplendline"))")
dsllinenumberdsllinenumber1 gplbeginlinefil
eio.getLinenumber() gplendlinefileio.getLinenum
ber() filemap.print(" mapping.add(new
Map("dsllinenumber", \"Robot.java\","gplbeginli
ne","gplendline"))")
Change here
Change
50
51AspectG Design Challenge
- Design of a join point model for AspectG
- What are the join points that will be captured in
AspectG? - Are AspectG join points static or dynamic?
- What is an appropriate pointcut language syntax
to describe these join points? - What are advice in this domain?
- Does the ordering of the advice matter? If so,
how is the weaving order prioritized? - How to deal with weaving conflicts and avoid
infinite weaving?
51
52Join Point Model for AspectG
ANTLR Grammar
AspectG
pointcut productions() within(command.) poi
ntcut count_gpllinenumber() within(command.)
match (fileio.print("timetime1"))
before() productions() dsllinenumberdsllinenu
mber1 before() count_gpllinenumber()
gplbeginlinefileio.getLinenumber() after()
count_gpllinenumber() gplendlinefileio.getLine
number() after() productions()
filemap.print(" mapping.add(new Map("
dsllinenumber", \"Robot.java\","gplbeginline
","gplendline"))")
command ( RIGHT
dsllinenumberdsllinenumber1
fileio.print("xx1") gplbeginlinefileio.g
etLinenumber() fileio.print("timetime1")
gplendlinefileio.getLinenumber()
fileio.print(" ") filemap.print("
mapping.add(new Map(" dsllinenumber",
\"Robot.java\","gplbeginline
","gplendline"))")
52
53Weaving into DSL Grammars Using AspectG
aspect debugging ( pointcut productions()
withincommand. pointcut count_gpllinenumber()
within command. match
fileio.print("timetime1") begin()
productions() dsllinenumberdsllinenumber1
after() count_gpllinenumber()
gplbeginlinefileio.getLinenumber()
gplendlinefileio.getLinenumber() )
default base domain Antlr. external pattern
mid_advice(bef_advsemantic_strings,
semico
QUOTED_STRING,
orig_stmtsemantic)
semantic 'mid_advice' in domain Antlr. rule
print_mid_stree(java_seq semantic) semantic -gt
semantic " \java_seq " -gt "\mid_advice\(\mi_a
dvice\(\) \, \semi\(\)\, \java_seq\)" if
java_seq "\semantic \mid_advice\(\mi_advice\(\
) \, \semi\(\)\, \java_seq\)". pattern
mi_advice() semantic_strings
"commandgplbeginlinefileio.getLinenumber()". p
attern semi() QUOTED_STRING
"\"timetime1\"". public ruleset a
print_mid_stree .
command ( RIGHT dsllinenumberdslli
nenumber1 fileio.print("//move right")
gplbeginlinefileio.getLinenumber()
fileio.print("xx1") gplendlinefileio.getL
inenumber() fileio.print("timetime1")
filemap.print(" mapping.add(new
Map("dsllinenumber", \"Robot.java\","gplbegi
nline","gplendline"))") fileio.print("
")
command ( RIGHT
fileio.print("//move right")
fileio.print("xx1") fileio.print("time
time1") fileio.print(" ")
53
54Steps to Weave Debugging Aspects into an ANTLR
Grammar
Specify ANTLR grammar specification Specify Java semantic actions using DMS regular expression Generate ANTLR Parser Generate abstract syntax tree with ANTLR_ACTION nodes Search ANTLR_ACTION nodes from the generated AST Retrieve ANTLR_ACTION nodes and store them in a hash map Retrieve associated string expression from each ANTLR_ACTION node Modify the regular Java parser by changing the starting production Parse the associated string expressions as regular Java statement lists Transform the statement lists using the ASTInterface API Regenerate the ANTLR_ACTION nodes with debugging aspects weaved in Output the complete ANTLR AST (with modified action nodes)
54
55DSL Line Number Counter Aspect in AspectG
aspect dsllinenumber ( pointcut productions() withincommand. after() productions() dsllinenumberdsllinenumber1
Corresponding Generated Low-level Rule
Transformation
1 default base domain Antlr. 2 3 external pattern after_advice(af_advstatement_string, 4 lefthandside IDENTIFIER, 5 orig_stmtsemantic) 6 semantic 'after_advice' in domain Antlr. 7 8 rule print_after_tree(java_seq semantic) semantic -gt semantic 9 " \java_seq " -gt "\after_advice\(\aft_advice\(\) \, \lhs\(\)\, \java_seq\)" 10 if java_seq"\semantic \after_advice\(\aft_advice\(\)\,\lhs\(\)\,\java_seq\)". 11 pattern aft_advice() statement_string "dsllinenumberdsllinenumber1". 12 13 pattern lhs() IDENTIFIER "command". 14 15 public ruleset a print_after_tree .
55
56AspectG Video Demo
- There are 7 sets of demos in 3 different video
formats - Available at
- www.cis.uab.edu/wuh/ddf/demos.html
57Related Work in the Area of Aspect-Oriented
Grammars
- AspectLISA
- Uses an explicit join point model
- Inheritance of advice and pointcuts
- Used for language extension, not tool generation
- AspectASF
- Weave crosscutting properties into an ASFSDF
specification - Unit test engine is not mentioned in the
generation list
57
58Outline
- Background
- DSL Debugging Framework (DDF)
- DSL Unit Testing Framework (DUTF)
- AspectG
- Future Work and Conclusion
59Future Work
- An extension of the current framework that
enables DSL profiling - Investigation into the scalable, reliable, and
extensible DSL testing framework - Application of different IDE platforms and GPLs
- Adaptation of DDF and DUTF to address more
complex DSLs - Generalize the framework in the areas of
tool-independence and language-independence - A DSL IDE for end-user programmers
- Adaptation to event grammar approach
- Exploiting further areas of aspect-oriented
features within the language grammar
59
60Contributions
- Provides a software framework empowering end-user
developers with traditional software engineering
debugging and unit testing capabilities at the
DSL level - Developed techniques for debugging and unit
testing a diverse set of DSLs - Developed an aspect language for grammars and
impacted the area of Grammarware
60
61Publications
- Journal papers 4 (2 under review), Conference
and workshop papers 7 - Hui Wu, Jeff Gray, and Marjan Mernik, Unit
Testing Support for Domain-Specific Languages,
under review, Journal of Research and Practice in
Information Technology. - Damijan Rebernak, Marjan Mernik, Hui Wu, and Jeff
Gray, Domain-Specific Aspect Languages for
Modularizing Crosscutting Concerns in Grammars,
under review, IET Special Issue on
Domain-Specific Aspect Languages. - Hui Wu, Jeff Gray, and Marjan Mernik,
Grammar-Driven Generation of Domain-Specific
Language Debuggers, accepted for publication,
Software Practice and Experience, 2007. - Pedro Rangel Henriques, Maria Joao Varanda
Pereira, Marjan Mernik, Mitja Lenic, Jeff Gray,
and Hui Wu, Automatic Generation of
Language-based Tools using LISA, IEE Proceedings
- Software, vol. 152, no. 02, April 2005, pp.
54-69. - Hui Wu, Jeff Gray, Suman Roychoudhury, and Marjan
Mernik, Weaving a Debugging Aspect into
Domain-Specific Language Grammars, ACM Symposium
for Applied Computing-Programming for Separation
of Concerns Track, Santa Fe, NM, March 2005, pp.
1370-1374. - Jeff Gray, Jing Zhang, Yuehua Lin, Hui Wu, Suman
Roychoudhury, Rajesh Sudarsan, Aniruddha Gokhale,
Sandeep Neema, Feng Shi, and Ted Bapty,
Model-Driven Program Transformation of a Large
Avionics Framework, Generative Programming and
Component Engineering, Springer-Verlag LNCS,
Vancouver, BC, October 2004, pp. 361-378. - Yuehua Lin, Song Zhou, Chuanxi Xu, Hui Wu, Jing
Zhang, Juanqin Wang, Jeff Gray, and Barrett
Bryant, E-R Modeler A Database Modeling Toolkit
for Eclipse, Annual ACM SE Conference,
Huntsville, Alabama, April 2004, pp. 160-165. - Suman Roychoudhury, Jeff Gray, Hui Wu, Jing
Zhang, and Yuehua Lin, A Comparative Analysis of
Meta-programming and Aspect-Orientation, Annual
ACM SE Conference, Savannah, GA, March 2003, pp.
196-201. - Damijan Rebernak, Marjan Mernik, Hui Wu, and Jeff
Gray, Domain-Specific Aspect Languages for
Modularizing Crosscutting Concerns in Grammars,
GPCE Workshop on Domain-Specific Aspect
Languages, Portland, OR, October 2006. - Hui Wu, Grammar-Driven Generation of
Domain-Specific Language Testing Tools,
Object-Oriented Programming, Systems, Languages
Applications, Doctoral Symposium 2006, Portland,
OR, October 2006. - Hui Wu, Automated Generation of Testing Tools
for Domain-Specific Languages, IEEE/ACM
International Conference on Automated Software
Engineering, Doctoral Symposium, Long Beach, CA,
November, 2005.
62Acknowledgement The work presented in this
dissertation was supported in part by the IBM
Innovation Grant.
Video demonstrations and papers available
at http//www.cis.uab.edu/wuh/ddf
Questions?
62
63Backup Slides
64GPL Line Number Counter Aspect in AspectG
aspect gplbeginlinenumber ( pointcut count_gpllinenumber() within command. match fileio.print("timetime1") after() count_gpllinenumber() gplbeginlinefileio.getLinenumber())
Corresponding Generated Low-level Rule
Transformation
1 default base domain Antlr. 2 3 pattern semi() QUOTED_STRING "\"timetime1\"". 4 5 external pattern mid_advice(bef_advsemantic_strings, 6 semico QUOTED_STRING, 7 orig_stmtsemantic) 8 semantic 'mid_advice' in domain Antlr. 9 10 rule print_mid_stree(java_seq semantic) semantic -gt semantic 11 " \java_seq " -gt "\mid_advice\(\mi_advice\(\) \, \semi\(\)\, \java_seq\)" 12 if java_seq"\semantic\mid_advice\(\mi_advice\(\) \, \semi\(\)\, \java_seq\)". 13 14 pattern m_advice()semantic_strings"commandgplbeginlinefileio.getLinenumber()". 15 16 public ruleset a print_mid_stree .
64