migrating code with smacc
play

Migrating code with SmaCC John Brant brant@refactoryworkers.com - PowerPoint PPT Presentation

Migrating code with SmaCC John Brant brant@refactoryworkers.com Migration Strategy Define Parser SmaCC Create transformation program Compatibility layer Normal development continues -Keeps same design garbage in


  1. Migrating code with SmaCC John Brant 
 brant@refactoryworkers.com

  2. Migration Strategy • Define Parser SmaCC • Create transformation program • Compatibility layer 
 ✓ Normal development continues -Keeps same design — garbage in garbage out

  3. Parser Definition • LALR(1)/LR(1) parsers • GLR • AST generation • Pattern matching

  4. AST Definition ExpressionNode • leftParens <number> : \d+ (\. \d*)? ; • rightParens <whitespace> : \s+; %left "+"; BinaryNode NumberNode %root Expression; • left • value • operator %su ffi x Node; • right Expression : Expression 'left' "+" 'operator' Expression 'right' {{Binary}} | "(" 'leftParen' Expression ")" 'rightParen' {{Expression}} | <number> 'value' {{Number}} ;

  5. Transformation Program • Ordered list of transformation rules + methods and properties • Declarative Pattern Rules Quick to write One-o ff expressions • Imperative Code Rules General syntax Control flow

  6. Pattern Rules • Search expression pattern-based AST • Replace expression is pattern-based string

  7. Pattern Matching <number> : \d+ (\. \d*) ? ; <whitespace> : \s+; `a` + `a` ⇒ `a` * 2 <patternToken> : `[^`]+`; Patterns can match any AST %glr; node %left "+"; %root Expression; %su ffi x Node; Expression : Expression 'left' "+" 'operator' Expression 'right' {{Binary}} | "(" 'leftParen' Expression ")" 'rightParen' {{Expression}} | <number> 'value' {{Number}} ;

  8. Pattern Example Source: Search Pattern: 3 + 3 `a` + `a` BinaryNode: + BinaryNode: + NumberNode: NumberNode: Anything: `a` Anything: `a` 3 3 `a` = 3

  9. 
 
 
 
 Replace Expressions • Replacement pattern is string macro • Original source replaced with expanded macro • Matched pattern nodes rewritten before replacement string is generated 
 `a` * 2 Replacement: 3 * 2 `a` = 3 Matched patterns:

  10. Pattern Examples for `a` := `b` to `c` - 1 do `d` ⇒ 
 for (`a` = `b`; `a` < `c`; `a`++) `\d\` `a/Forms.TCustomForm`.Constraints.MinHeight := `b` ⇒ 
 `a`.MinimumSize = new Size(`a`.MinimumSize.Width, `b`)

  11. Code Rules • Smalltalk expressions • Search expressions based on AST node and code • Replace expressions Edit expressions Control flow General Smalltalk code

  12. Edit Expressions • Custom framework messages for editing source • Replacing 
 #replace:with: #replaceAll:with: … • Moving 
 #move:before: #move:after … • Inserting 
 #insert:before: #insert:afterAll: … • Deleting 
 #delete: #deleteWithWhitespaceAfter: …

  13. Control Flow • Normal traversal is depth first • Change the order that nodes are traversed 
 #processChild: #processChildren #continue

  14. Code Examples “{ }” 
 For: DelphiStatementBlockNode 
 When: 
 true 
 Do: 
 self replace: match beginToken with: '{'. 
 self replace: match endToken with: ‘}'. 
 self continue “function objects” 
 For: PBTypeDeclarationNode 
 When: 
 match from source sameAs: 'function_object' 
 Do: 
 self isStatic: true. 
 self classStart: match startPosition. 
 self 
 replace: match 
 with: 'public partial class ' , self functionsClassName , ' {'

  15. Parser Debugger

  16. Previewing

  17. Rule Debugger

  18. Questions? http://www.refactoryworkers.com/SmaCC/ Download for Pharo: Gofer new smalltalkhubUser: 'JohnBrant' project: 'SmaCC'; configurationOf: 'SmaCC'; loadBleedingEdge

Download Presentation
Download Policy: The content available on the website is offered to you 'AS IS' for your personal information and use only. It cannot be commercialized, licensed, or distributed on other websites without prior consent from the author. To download a presentation, simply click this link. If you encounter any difficulties during the download process, it's possible that the publisher has removed the file from their server.

Recommend


More recommend