Introducing Static Semantic Introducing Static Semantic Analysis to Templates Analysis to Templates Using JastAddUsing JastAddJos PeetersJos Peeters
/ name of department PAGE 204/22/23
Goal
Ambition• Improve the quality of code generators based on templates.
Primary Research Question• Can static semantic checking be used in template-based code
generators using off-the-shelf tooling?
/ name of department PAGE 304/22/23
Research Questions
• Can JastAdd be coupled to Repleo?• Is the resulting coupling scalable?
• How can static semantic checking be performed on templates?• How to deal with syntactic ambiguities?• How to implement this using JastAdd?
/ name of department PAGE 404/22/23
• Research Questions• Tools
• Repleo• JastAdd• Connection
• Methodology • Placeholders• Static Semantic Checking• Syntactic Ambiguities
• Implementing the Methodology• Conclusion
/ name of department PAGE 504/22/23
Tools
• Repleo• Syntax-safe template engine
• JastAdd• Java-based compiler compiler system• Object-oriented abstract syntax• Advanced attribute grammar features
/ name of department PAGE 604/22/23
Repleo
• Templates• Architectural Pattern• Code with empty spaces and generative commands
• Features• Guarantees syntax-safe output code• Provides meta-language for templates
/ name of department PAGE 704/22/23
Repleo
/ name of department PAGE 804/22/23
JastAdd
• Features• Abstract Syntax• Parser Independent• Extended support Attribute Grammars• Aspect Oriented
/ name of department PAGE 904/22/23
JastAdd
/ name of department PAGE 1004/22/23
Abstract syntax
abstract BlockStmt;abstract Stmt: BlockStmt;
AssignStmt : Stmt ::= Variable:Access Value:Exp;WhileStmt : Stmt ::= Condition:Exp Body:Stmt;
abstract Exp;abstract Access:Exp;IntLiteral : Exp ::= <Value:String>;
abstract Operator : Exp;abstract BinOperator : Operator ::= lhs:Exp rhs:Exp;PlusOp : BinOperator;
/ name of department PAGE 1104/22/23
Attributes
Properties as attributes• Synthesized• Inherited• Equations
Also:• Rewrites• Circular attributes• Non-terminal attributes
/ name of department PAGE 1204/22/23
Weaving Aspects
aspect TypeAnalysis { syn lazy TypeDecl Exp.type();
eq BinOperator.type() { if (getlhs().type().isSubtypeOf(getrhs().type()) || getrhs().type().isSubtypeOf(getlhs().type()) )
{ if (getlhs().type().isUnknown() )
return getrhs().type(); return getlhs().type(); } return unknownDecl().type(); }
eq IntLiteral.type() = intType();}
/ name of department PAGE 1304/22/23
Connection
• Boolean Evaluator• Simple boolean expressions
• Java 1.4• Using JastAddJ
/ name of department PAGE 1404/22/23
Connection
/ name of department PAGE 1504/22/23
Connection JastAddJ
Issues• No strict separation between checker and parser
• Instantiation parts of checker• Rewriting during parse phase• Grammar differences between SDF and AST
For placeholder a 1-to-1 transformation is required
/ name of department PAGE 1604/22/23
• Research Questions• Tools
• Repleo• JastAdd• Connection
• Methodology • Placeholders• Static Semantic Checking• Syntactic Ambiguities
• Implementing the Methodology• Conclusion
/ name of department PAGE 1704/22/23
Placeholders(1)
What are placeholders?• Representation of empty space in code• Substitution or generative command• Properties defined by place of occurrence
"<:" TreeQuery ":>" -> PlaceHolderSubstitution[[X]]
/ name of department PAGE 1804/22/23
Placeholders(2)
Substitutionint <: x :>;
Conditional<: if x == "true" then :> boolean b; <: else :> int i; <: fi :>
/ name of department PAGE 1904/22/23
Placeholders (3)
Iterativeint i = 0;<: foreach $x in X do :> i = i + <: $x :>;<: od :>
Match-Replaceint i = 0;i = <: match X :> <: [$e,$t] = :> <: $e :> + <: $t :> <: [] = :> 0<: end :>;
/ name of department PAGE 2004/22/23
Static Semantic Checking
• Target language• Type checking• Context related checks (f.i. duplicate declarations)
• Placeholders language• Uniqueness meta-variables (i.e. $e)
• Combination of both• Checking influence of placeholders on target language• “Bad Smells”
/ name of department PAGE 2104/22/23
Bad Smells
Not permitted• errors that are related to properties of placeholders
<: foreach $x in X do :> int i;<: od :>
Permitted• restrictions given only by the input data
<: foreach $x in X do :> int <: $x :>;<: od :>
/ name of department PAGE 2204/22/23
Syntactic Ambiguities
• Occur when multiple production can be applied• Parsing problem
• SGLR• Bad Smell
public class A { <: a :> <: b :>(){}}
/ name of department PAGE 2304/22/23
Disambiguation
• Via Context• Use static semantic checker• Compare previous use of placeholders
public class A { <: a :> i = 0;
<: a :> <: b :>(){}}
/ name of department PAGE 2404/22/23
Disambiguation
• Using prioritization• Select the option
containing the placeholder
{ int i; i = <: a :>;}
/ name of department PAGE 2504/22/23
• Research Questions• Tools
• Repleo• JastAdd• Connection
• Methodology • Placeholders• Static Semantic Checking• Syntactic Ambiguities
• Implementing the Methodology• Conclusion
/ name of department PAGE 2604/22/23
Implementing the Methodology
PicoJava• Subset of Java• Originally an example of JastAdd
Present• PicoJava language definition in JastAdd• Attributes to support checking• Static semantic checker• SDF definition Placeholders
/ name of department PAGE 2704/22/23
Pipeline
/ name of department PAGE 2804/22/23
Implementation
Implemented as part of this project• SDF definition PicoJava• Traversal SGLR JastAdd
With JastAdd• Language definition placeholders• Extend attributes for the placeholders• Static semantic checker
• Placeholders• Bad Smells
• Ambiguity nodes• Disambiguation filter
NB. JastAdd is Aspect-Oriented
/ name of department PAGE 2904/22/23
Example - Template
template({ <: if x == $e then :> boolean i; i = <: match y :> <: [$e, $t] = :> <: $e :> + <: $t :> <: [] = :> 0 <: end :>; <: fi :> i = 0; })
123456789
101112
/ name of department PAGE 3004/22/23
Example – Output(1)
--> Resolving ambiguities 6:21 Ambiguity found: Exp Ambiguity resolved using prioritization 6:32 Ambiguity found: Exp Ambiguity resolved using prioritization Done
/ name of department PAGE 3104/22/23
Example – Output(2)--> Language Errors 10:2 : Can not assign to a variable of type boolean a value of type int
--> Placeholder Errors6:6 : duplicate declaration of meta-variables [$e]
--> Placeholder Bad Smells 7:6 : inferred type of placeholder does not match the type of its declaration
10:2 : Variable i might not be declared, dependent on [x]
--> List of PlaceHolders $e PhExp $unknown $unknown $t PhExp $unknown $unknown y PhMRExp $unknown int x PhIfBlockStmt $unknown $unknown
/ name of department PAGE 3204/22/23
Conclusions
Presented in this Thesis• Static Semantic Checks on Template• Use of off-the-shelf tools
• Repleo• JastAdd
Methodology• Multi-language approach• Ease-of-use of templates• Syntax-safe• Static Semantic Analysis
/ name of department PAGE 3304/22/23
Questions