Introduc)on
TristanNaumann
SaharHasan
SteveHehl
BrianLu
Introduc)on
FriendlyInterac)veRecursionEducator(FIRE)• Recursionisoneofthemostdifficulttopicsfornoviceprogrammerstounderstand
• Teachthroughinterac)vevisualiza)on:usersseetheprogressionofrecursivecallsandthepropaga)onofresultsbacktotheoriginalcall
• Simplesyntax:more)melearningrecursion,less)medebuggingcode
Syntax
AnexampleusingtheFibonaccinumbers:
define recursive int fibonacci (int n): base: {n == 0} 0 {n == 1} 1 recursive: { } fibonacci(n–1) + fibonacci(n–2)
Syntax
AnexampleusingtheFibonaccinumbers:
define recursive int fibonacci (int n): base: {n == 0} 0 {n == 1} 1 recursive: { } fibonacci(n–1) + fibonacci(n–2)
Keywordssignifyingthebeginningoftherecursivefunc)ondefini)on
Syntax
AnexampleusingtheFibonaccinumbers:
define recursive int fibonacci (int n): base: {n == 0} 0 {n == 1} 1 recursive: { } fibonacci(n–1) + fibonacci(n–2)
Returndatatype
Syntax
AnexampleusingtheFibonaccinumbers:
define recursive int fibonacci (int n): base: {n == 0} 0 {n == 1} 1 recursive: { } fibonacci(n–1) + fibonacci(n–2)
Func)onname
Syntax
AnexampleusingtheFibonaccinumbers:
define recursive int fibonacci (int n): base: {n == 0} 0 {n == 1} 1 recursive: { } fibonacci(n–1) + fibonacci(n–2)
Comma‐delimitedparameterlist
Syntax
AnexampleusingtheFibonaccinumbers:
define recursive int fibonacci (int n): base: {n == 0} 0 {n == 1} 1 recursive: { } fibonacci(n–1) + fibonacci(n–2)
Indentedblockofbasecasesoftheform:{condi)on}returnVal
Syntax
AnexampleusingtheFibonaccinumbers:
define recursive int fibonacci (int n): base: {n == 0} 0 {n == 1} 1 recursive: { } fibonacci(n–1) + fibonacci(n–2)
Indentedblockoftheimplicitlyreturnedrecursivecase:{}recursiveCall
Syntax
Othersyntac)calfeatures• Watchblock:comma‐delimitedlistofvariableswhosevaluestheuserwishestotrack
• Explicitcondi)onals(if/else)andloops(for,while)
• Built‐infunc)onsforlists• Printstatementsandcomments
Syntax
Whitespacing• FIREusesPython‐basedwhitespaceindenta)onforblockdelimi)nginsteadofcurlybraces
• Indenta)onfollowscertainstatementsandsignifiesthebeginningofablock
• Dedenta)onsignifiestheendofablock
Syntax
Advantages• Makescodemorereadable
• Easiertowritebecausededentsareautoma)callymatchedtoindentsfortheuser
Disadvantages
• Hardertoimplementbecauseindenta)onlevelsmustbetrackedusingastackasopposedtosimplydetec)ngmatchingbraces
Syntax
Stackimplementa)onnotesfromPython• Foreachline,compareindenta)onleveltotopofstack(ini)allycontainsonepushed0)– Ifequal,donothing– Iflarger,pushontostackandissueINDENT– Ifsmaller,popallnumbersonstackthatarelargerandissueDEDENTforeach
• OnEOF,issueremainingDEDENTS
Output
Screenshotofarecursivecallstep
Output
Screenshotofareturnvaluepropaga)ngback
SystemArchitecture
Overview
ANTLRInputStream Lexer WSFilter Common
TokenStream
ParserString
Template Fire.java Javacompiler
Fire.classJVM
Errorchecking+scoping
Characters Tokens
Parsed
GUIpackage Backend Frontend
Userfile
SystemArchitecture
Overview
ANTLRInputStream Lexer WSFilter Common
TokenStream
ParserString
Template Fire.java Javacompiler
Fire.classJVM
Errorchecking+scoping
Characters Tokens
Parsed
GUIpackage Backend Frontend
Userfile
SystemArchitecture
Overview
ANTLRInputStream Lexer WSFilter Common
TokenStream
ParserString
Template Fire.java Javacompiler
Fire.classJVM
Errorchecking+scoping
Characters Tokens
Parsed
GUIpackage Backend Frontend
Userfile
SystemArchitecture
Overview
ANTLRInputStream Lexer WSFilter Common
TokenStream
ParserString
Template Fire.java Javacompiler
Fire.classJVM
Errorchecking+scoping
Characters Tokens
Parsed
GUIpackage Backend Frontend
Userfile
SystemArchitecture
Overview
ANTLRInputStream Lexer WSFilter Common
TokenStream
ParserString
Template Fire.java Javacompiler
Fire.classJVM
Errorchecking+scoping
Characters Tokens
Parsed
GUIpackage Backend Frontend
Userfile
SystemArchitecture
Developmenttools• EclipseGanymede+Subeclipse
• ANTLRv3+StringTemplate3.2
• JavaSE6+SwingManagementtools
• GoogleCode• GoogleDocs
Tes)ng
Mul)‐stagetes)ngapproach• Unittes)ngwhitespacing• Unittes)nggrammarproduc)onrules
• Usertes)ngfullexamples
Tes)ng
Whitespacetes)ngSource(fibonacci.fire) Tokenstreamoutput
define recursive int fibonacci (int n): <DEFINE> <WS> <RECURSIVE> <WS> <TINT> <WS> <NAME> <WS> <LPAREN> <TINT> <WS> <NAME> <RPAREN> <COLON> <NEWLINE>
base: <INDENT> <BASE> <COLON> <NEWLINE>
{n == 0} 0 <INDENT> <LCURLY> <NAME> <WS> <EQ> <WS> <INT> <RCURLY> <WS> <INT> <NEWLINE>
{n == 1} 1 <LCURLY> <NAME> <WS> <EQ> <WS> <INT> <RCURLY> <WS> <INT> <NEWLINE>
recursive: <DEDENT> <RECURSIVE> <COLON> <NEWLINE>
{ } fibonacci(n–1) + fibonacci(n–2) <INDENT> <LCURLY> <WS> <RCURLY> <WS> <NAME> <LPAREN> <NAME> <MINUS> <INT> <RPAREN> <WS> <PLUS> <WS> <NAME> <LPAREN> <NAME> <MINUS> <INT> <RPAREN> <NEWLINE>
<DEDENT> <DEDENT>
Tes)ng
Grammarproduc)ontes)ng
Outputresultofcomparison
Equivalent(PASS) Notequivalent(FAIL)
Tester:TranslateprogramtoJavaandcomparetotargetcode
Inputs
FIREProgram Javatargetcode
Conclusion
Lessonslearned• User‐friendlylanguagesarehardertowriteandtest
• Pythonasareferencelanguage:noteverythingtranslateswelltoJava
Futureimprovements
• Supportforcorecusion• Mul)pletypesofoutput
Conclusion
Keybenefits• Supportsmanycommonrecursionsofmul)pletypes
• Shallowlearningcurve;codeisbotheasytowriteandunderstand
• Automatedinstrumenta)onofthecodeandvisualoutput