SlideShare a Scribd company logo
FPARSEC HANDS ON
Phillip Trelford
F#unctional Londoners,
2014
FParsec Hands On -  F#unctional Londoners 2014
INTERNAL DSLS - EXAMPLES
Fake
#r "tools/FAKE/tools/FakeLib.dll"
open Fake
Target "Test" (fun _ ->
trace "Testing stuff..."
)
Target "Deploy" (fun _ ->
trace "Heavy deploy action"
)
"Test" // define the dependencies
==> "Deploy"
Run "Deploy"
Canopy
"starting a game of 2048" &&& fun _ ->
start firefox
url "http://gabrielecirulli.github.io/2048/"
let score = element ".score-container"
printfn "Score %s" score.Text
while not(lost()) && not (won()) do
press up
press right
press left
press up
EXTERNAL DSLS IN ACTION
1. Domain-specific syntax
2. Proprietary encodings
3. Custom execution
environments
BUILDING EXTERNAL DSLS
Abstract Syntax Tree (AST)
Parse
Execute
PARSING OPTIONS
Hand rolled
•Regex
•Active
Patterns
FParsec
•Combinators
•Monadic
FsLex, FsYacc
•Lexer
•Parser
FPARSEC
FParsec Hands On
F#unctional Londoners
2014
THINGS YOU SHOULD NEVER DO
Custom Operators
Funny picture
FUNSCRIPT’S TYPESCRIPT PARSER
FParsec
let interfaceDeclaration =
str_ws "interface" >>. identifier .>>. typeParams
.>>. interfaceExtendsClause .>>. objectType
|>> fun (((id, tps), ex), t) ->
InterfaceDeclaration(id, tps, ex, t)
TypeScript Definition
interface JQueryKeyEventObject
extends JQueryInputEventObject {
char: any;
charCode: number;
key: any;
keyCode: number;
}
FPARSEC TUTORIAL
open FParsec
let test p str =
match run p str with
| Success(result, _, _) -> printfn "Success: %A" result
| Failure(errorMsg, _, _) -> printfn "Failure: %s" errorMsg
test pfloat "1.25"
test pfloat "1.25E 2"
let str s = pstring s
let floatBetweenBrackets = str "[" >>. pfloat .>> str "]"
test floatBetweenBrackets "[1.0]"
test floatBetweenBrackets "[]"
test floatBetweenBrackets "[1.0]"
PARSING OPERATORS
// we set up an operator precedence parser for parsing the arithmetic expressions
let opp = new OperatorPrecedenceParser<float,unit,unit>()
let expr = opp.ExpressionParser
opp.TermParser <- number <|> between (str_ws "(") (str_ws ")") expr
// operator definitions follow the schema
// operator type, string, trailing whitespace parser, precedence, associativity, function to apply
opp.AddOperator(InfixOperator("+", ws, 1, Associativity.Left, (+)))
opp.AddOperator(InfixOperator("-", ws, 1, Associativity.Left, (-)))
opp.AddOperator(InfixOperator("*", ws, 2, Associativity.Left, (*)))
opp.AddOperator(InfixOperator("/", ws, 2, Associativity.Left, (/)))
opp.AddOperator(InfixOperator("^", ws, 3, Associativity.Right, fun x y -> System.Math.Pow(x, y)))
opp.AddOperator(PrefixOperator("-", ws, 4, true, fun x -> -x))
TURTLES ALL THE WAY
DOWN
FParsec Hands On
F#unctional Londoners
2014
TURTLE LANGUAGE
repeat 10
[right 36 repeat 5
[forward 54 right 72]]
TURTLE AST
module AST
type arg = int
type command =
| Forward of arg
| Turn of arg
| Repeat of arg * command list
TURTLE PARSER: FORWARD AND
TURN
open AST
open FParsec
let pforward =
pstring "forward" >>. spaces1 >>. pfloat
|>> fun x -> Forward(int x)
let pleft =
pstring "left" >>. spaces1 >>. pfloat
|>> fun x -> Turn(int -x)
let pright =
pstring "right" >>. spaces1 >>. pfloat
|>> fun x -> Turn(int x)
TURTLE PARSER: REPEAT
COMMAND
let pcommand = pforward <|> pleft <|> pright
let block = between (pstring "[") (pstring "]") (many1 (pcommand .>> spaces))
let prepeat =
pstring "repeat" >>. spaces1 >>. pfloat .>> spaces .>>. block
|>> fun (n,commands) -> Repeat(int n, commands)
TURTLE PARSER: FORWARD
REPEAT
let prepeat, prepeatimpl = createParserForwardedToRef ()
let pcommand = pforward <|> pleft <|> pright <|> prepeat
let block = between (pstring "[") (pstring "]") (many1 (pcommand .>> spaces))
prepeatimpl :=
pstring "repeat" >>. spaces1 >>. pfloat .>> spaces .>>. block
|>> fun (n,commands) -> Repeat(int n, commands)
TURTLE INTERPRETER: PATTERN
MATCHING
let rec perform turtle = function
| Forward n ->
let r = float turtle.A * Math.PI / 180.0
let dx, dy = float n * cos r, float n * sin r
let x, y = turtle.X, turtle.Y
let x',y' = x + dx, y + dy
drawLine (x,y) (x',y')
{ turtle with X = x'; Y = y' }
| Turn n -> { turtle with A = turtle.A + n }
| Repeat (n, commands) ->
let rec repeat turtle = function
| 0 -> turtle
| n -> repeat (performAll turtle commands) (n-1)
repeat turtle n
and performAll = List.fold perform
TURTLE: PROCEDURES
to square
repeat 4 [forward 50 right 90]
end
to flower
repeat 36 [right 10 square]
end
to garden
repeat 25 [set-random-position flower]
end
garden
SMALL BASIC COMPILER
FParsec Hands On
F#unctional Londoners
2014
SMALL BASIC IDE
FParsec Hands On
F#unctional Londoners
2014
SMALL BASIC
SAMPLE
Sub Init
gw = 598
gh = 428
GraphicsWindow.BackgroundColor =
"DodgerBlue"
GraphicsWindow.Width = gw
GraphicsWindow.Height = gh
color = "1=Orange;2=Cyan;3=Lime;"
size = "1=20;2=16;3=12;"
passed = 0
cd = "False" ' collision detected
EndSub
SMALL BASIC AST
/// Small Basic expression
type expr =
| Literal of value
| Identifier of identifier
| GetAt of location
| Func of invoke
| Neg of expr
| Arithmetic of expr * arithmetic * expr
| Comparison of expr * comparison * expr
| Logical of expr * logical * expr
/// Small Basic instruction
type instruction =
| Assign of assign
| SetAt of location * expr
| PropertySet of string * string * expr
| Action of invoke
| For of assign * expr * expr
| EndFor
| If of expr
| ElseIf of expr
| Else
| EndIf
| While of expr
| EndWhile
| Sub of identifier * string list
| EndSub
| Label of label
| Goto of label
SMALL BASIC PARSER
/// > For i = 1 To 100 Step 2
let pfor =
let pfrom = str_ws1 "For" >>. pset
let pto = str_ws1 "To" >>. pexpr
let pstep = str_ws1 "Step" >>. pexpr
let toStep = function None -> Literal(Int(1)) | Some s -> s
pipe3 pfrom pto (opt pstep) (fun f t s -> For(f, t, toStep s))
let pendfor = str_ws "EndFor" |>> (fun _ -> EndFor)
SMALL BASIC COMPILER: GOTO
| Goto(name) ->
let label = obtainLabel il name
il.Emit(OpCodes.Br, label)
| Label(name) ->
let label = obtainLabel il name
il.MarkLabel(label)
RESOURCES
FParsec Hands On
F#unctional Londoners
2014
F# KOANS
[<Koan>]
let SquareEvenNumbersWithPipelineOperator() =
(* In F#, you can use the pipeline operator to get the benefit of
the parens style with the readability of the statement style. *)
let result =
[0..5]
|> List.filter isEven
|> List.map square
AssertEquality result __
TRYFSHARP.ORG
F# BOOKS
QUESTIONS
Twitter: @ptrelford
Blog: http://trelford.com/blog
Turtle: http://fssnip.net/nN

More Related Content

PPTX
Write Your Own Compiler in 24 Hours
PDF
Functional programming in Python
PDF
Functional Programming Patterns (BuildStuff '14)
PDF
Thinking in Functions: Functional Programming in Python
PPTX
Python Programming Essentials - M16 - Control Flow Statements and Loops
PPT
Fp201 unit5 1
KEY
Let's build a parser!
PPTX
Python programming workshop session 1
Write Your Own Compiler in 24 Hours
Functional programming in Python
Functional Programming Patterns (BuildStuff '14)
Thinking in Functions: Functional Programming in Python
Python Programming Essentials - M16 - Control Flow Statements and Loops
Fp201 unit5 1
Let's build a parser!
Python programming workshop session 1

What's hot (20)

PPTX
Learn c++ (functions) with nauman ur rehman
PDF
An introduction to property based testing
PDF
Swift 2
PPT
FP 201 - Unit 6
PPT
FP 201 - Unit 3 Part 2
PDF
Swift Programming Language
PDF
Let's make a contract: the art of designing a Java API
PPTX
Functional programming
PPT
An Overview Of Python With Functional Programming
PDF
Functional programming ii
PPTX
Python programming
PPTX
Kotlin as a Better Java
ODP
Python quickstart for programmers: Python Kung Fu
PPT
Unit 6 pointers
PPT
Fp201 unit4
PDF
Imugi: Compiler made with Python
PDF
Intro to Functional Programming
ODP
OpenGurukul : Language : C++ Programming
PDF
A swift introduction to Swift
Learn c++ (functions) with nauman ur rehman
An introduction to property based testing
Swift 2
FP 201 - Unit 6
FP 201 - Unit 3 Part 2
Swift Programming Language
Let's make a contract: the art of designing a Java API
Functional programming
An Overview Of Python With Functional Programming
Functional programming ii
Python programming
Kotlin as a Better Java
Python quickstart for programmers: Python Kung Fu
Unit 6 pointers
Fp201 unit4
Imugi: Compiler made with Python
Intro to Functional Programming
OpenGurukul : Language : C++ Programming
A swift introduction to Swift
Ad

Similar to FParsec Hands On - F#unctional Londoners 2014 (20)

PPTX
Build a compiler in 2hrs - NCrafts Paris 2015
PDF
What's in Kotlin for us - Alexandre Greschon, MyHeritage
KEY
Hidden treasures of Ruby
PDF
Discover Dart - Meetup 15/02/2017
PDF
Discover Dart(lang) - Meetup 07/12/2016
PDF
Using browser() in R
PPTX
Reasonable Code With Fsharp
KEY
Five Languages in a Moment
PDF
Ruby is an Acceptable Lisp
PDF
Elixir cheatsheet
PPTX
Rust Intro
PDF
PythonOOP
PDF
Petitparser at the Deep into Smalltalk School 2011
PDF
仕事で使うF#
PDF
Elm: give it a try
PDF
Rakudo
PDF
Python utan-stodhjul-motorsag
DOCX
Game unleashedjavascript
PPT
Scala presentation by Aleksandar Prokopec
PDF
ssh.isdn.test
Build a compiler in 2hrs - NCrafts Paris 2015
What's in Kotlin for us - Alexandre Greschon, MyHeritage
Hidden treasures of Ruby
Discover Dart - Meetup 15/02/2017
Discover Dart(lang) - Meetup 07/12/2016
Using browser() in R
Reasonable Code With Fsharp
Five Languages in a Moment
Ruby is an Acceptable Lisp
Elixir cheatsheet
Rust Intro
PythonOOP
Petitparser at the Deep into Smalltalk School 2011
仕事で使うF#
Elm: give it a try
Rakudo
Python utan-stodhjul-motorsag
Game unleashedjavascript
Scala presentation by Aleksandar Prokopec
ssh.isdn.test
Ad

More from Phillip Trelford (20)

PPTX
How to be a rock star developer
PPTX
Mobile F#un
PPTX
F# eXchange Keynote 2016
PPTX
FSharp eye for the Haskell guy - London 2015
PPTX
Beyond lists - Copenhagen 2015
PPTX
F# for C# devs - Copenhagen .Net 2015
PPTX
Generative Art - Functional Vilnius 2015
PPTX
24 hours later - FSharp Gotham 2015
PPTX
Building cross platform games with Xamarin - Birmingham 2015
PPTX
Beyond Lists - Functional Kats Conf Dublin 2015
PPTX
FSharp On The Desktop - Birmingham FP 2015
PPTX
Ready, steady, cross platform games - ProgNet 2015
PPTX
F# for C# devs - NDC Oslo 2015
PPTX
F# for C# devs - Leeds Sharp 2015
PPTX
24 Hours Later - NCrafts Paris 2015
PPTX
Real World F# - SDD 2015
PPTX
F# for C# devs - SDD 2015
PPTX
Machine learning from disaster - GL.Net 2015
PPTX
F# for Trading - QuantLabs 2014
PPTX
F# in your pipe
How to be a rock star developer
Mobile F#un
F# eXchange Keynote 2016
FSharp eye for the Haskell guy - London 2015
Beyond lists - Copenhagen 2015
F# for C# devs - Copenhagen .Net 2015
Generative Art - Functional Vilnius 2015
24 hours later - FSharp Gotham 2015
Building cross platform games with Xamarin - Birmingham 2015
Beyond Lists - Functional Kats Conf Dublin 2015
FSharp On The Desktop - Birmingham FP 2015
Ready, steady, cross platform games - ProgNet 2015
F# for C# devs - NDC Oslo 2015
F# for C# devs - Leeds Sharp 2015
24 Hours Later - NCrafts Paris 2015
Real World F# - SDD 2015
F# for C# devs - SDD 2015
Machine learning from disaster - GL.Net 2015
F# for Trading - QuantLabs 2014
F# in your pipe

Recently uploaded (20)

PDF
How to Migrate SBCGlobal Email to Yahoo Easily
PPTX
ai tools demonstartion for schools and inter college
PDF
Internet Downloader Manager (IDM) Crack 6.42 Build 42 Updates Latest 2025
PDF
PTS Company Brochure 2025 (1).pdf.......
PDF
SAP S4 Hana Brochure 3 (PTS SYSTEMS AND SOLUTIONS)
PPTX
Operating system designcfffgfgggggggvggggggggg
PPTX
Online Work Permit System for Fast Permit Processing
PDF
Odoo Companies in India – Driving Business Transformation.pdf
PDF
Design an Analysis of Algorithms I-SECS-1021-03
PPTX
Transform Your Business with a Software ERP System
PDF
Adobe Illustrator 28.6 Crack My Vision of Vector Design
PDF
top salesforce developer skills in 2025.pdf
PPTX
history of c programming in notes for students .pptx
PDF
Why TechBuilder is the Future of Pickup and Delivery App Development (1).pdf
PDF
Wondershare Filmora 15 Crack With Activation Key [2025
PPTX
Introduction to Artificial Intelligence
PDF
System and Network Administration Chapter 2
PPTX
CHAPTER 12 - CYBER SECURITY AND FUTURE SKILLS (1) (1).pptx
PPTX
ISO 45001 Occupational Health and Safety Management System
PPTX
L1 - Introduction to python Backend.pptx
How to Migrate SBCGlobal Email to Yahoo Easily
ai tools demonstartion for schools and inter college
Internet Downloader Manager (IDM) Crack 6.42 Build 42 Updates Latest 2025
PTS Company Brochure 2025 (1).pdf.......
SAP S4 Hana Brochure 3 (PTS SYSTEMS AND SOLUTIONS)
Operating system designcfffgfgggggggvggggggggg
Online Work Permit System for Fast Permit Processing
Odoo Companies in India – Driving Business Transformation.pdf
Design an Analysis of Algorithms I-SECS-1021-03
Transform Your Business with a Software ERP System
Adobe Illustrator 28.6 Crack My Vision of Vector Design
top salesforce developer skills in 2025.pdf
history of c programming in notes for students .pptx
Why TechBuilder is the Future of Pickup and Delivery App Development (1).pdf
Wondershare Filmora 15 Crack With Activation Key [2025
Introduction to Artificial Intelligence
System and Network Administration Chapter 2
CHAPTER 12 - CYBER SECURITY AND FUTURE SKILLS (1) (1).pptx
ISO 45001 Occupational Health and Safety Management System
L1 - Introduction to python Backend.pptx

FParsec Hands On - F#unctional Londoners 2014

  • 1. FPARSEC HANDS ON Phillip Trelford F#unctional Londoners, 2014
  • 3. INTERNAL DSLS - EXAMPLES Fake #r "tools/FAKE/tools/FakeLib.dll" open Fake Target "Test" (fun _ -> trace "Testing stuff..." ) Target "Deploy" (fun _ -> trace "Heavy deploy action" ) "Test" // define the dependencies ==> "Deploy" Run "Deploy" Canopy "starting a game of 2048" &&& fun _ -> start firefox url "http://gabrielecirulli.github.io/2048/" let score = element ".score-container" printfn "Score %s" score.Text while not(lost()) && not (won()) do press up press right press left press up
  • 4. EXTERNAL DSLS IN ACTION 1. Domain-specific syntax 2. Proprietary encodings 3. Custom execution environments
  • 5. BUILDING EXTERNAL DSLS Abstract Syntax Tree (AST) Parse Execute
  • 8. THINGS YOU SHOULD NEVER DO Custom Operators Funny picture
  • 9. FUNSCRIPT’S TYPESCRIPT PARSER FParsec let interfaceDeclaration = str_ws "interface" >>. identifier .>>. typeParams .>>. interfaceExtendsClause .>>. objectType |>> fun (((id, tps), ex), t) -> InterfaceDeclaration(id, tps, ex, t) TypeScript Definition interface JQueryKeyEventObject extends JQueryInputEventObject { char: any; charCode: number; key: any; keyCode: number; }
  • 10. FPARSEC TUTORIAL open FParsec let test p str = match run p str with | Success(result, _, _) -> printfn "Success: %A" result | Failure(errorMsg, _, _) -> printfn "Failure: %s" errorMsg test pfloat "1.25" test pfloat "1.25E 2" let str s = pstring s let floatBetweenBrackets = str "[" >>. pfloat .>> str "]" test floatBetweenBrackets "[1.0]" test floatBetweenBrackets "[]" test floatBetweenBrackets "[1.0]"
  • 11. PARSING OPERATORS // we set up an operator precedence parser for parsing the arithmetic expressions let opp = new OperatorPrecedenceParser<float,unit,unit>() let expr = opp.ExpressionParser opp.TermParser <- number <|> between (str_ws "(") (str_ws ")") expr // operator definitions follow the schema // operator type, string, trailing whitespace parser, precedence, associativity, function to apply opp.AddOperator(InfixOperator("+", ws, 1, Associativity.Left, (+))) opp.AddOperator(InfixOperator("-", ws, 1, Associativity.Left, (-))) opp.AddOperator(InfixOperator("*", ws, 2, Associativity.Left, (*))) opp.AddOperator(InfixOperator("/", ws, 2, Associativity.Left, (/))) opp.AddOperator(InfixOperator("^", ws, 3, Associativity.Right, fun x y -> System.Math.Pow(x, y))) opp.AddOperator(PrefixOperator("-", ws, 4, true, fun x -> -x))
  • 12. TURTLES ALL THE WAY DOWN FParsec Hands On F#unctional Londoners 2014
  • 13. TURTLE LANGUAGE repeat 10 [right 36 repeat 5 [forward 54 right 72]]
  • 14. TURTLE AST module AST type arg = int type command = | Forward of arg | Turn of arg | Repeat of arg * command list
  • 15. TURTLE PARSER: FORWARD AND TURN open AST open FParsec let pforward = pstring "forward" >>. spaces1 >>. pfloat |>> fun x -> Forward(int x) let pleft = pstring "left" >>. spaces1 >>. pfloat |>> fun x -> Turn(int -x) let pright = pstring "right" >>. spaces1 >>. pfloat |>> fun x -> Turn(int x)
  • 16. TURTLE PARSER: REPEAT COMMAND let pcommand = pforward <|> pleft <|> pright let block = between (pstring "[") (pstring "]") (many1 (pcommand .>> spaces)) let prepeat = pstring "repeat" >>. spaces1 >>. pfloat .>> spaces .>>. block |>> fun (n,commands) -> Repeat(int n, commands)
  • 17. TURTLE PARSER: FORWARD REPEAT let prepeat, prepeatimpl = createParserForwardedToRef () let pcommand = pforward <|> pleft <|> pright <|> prepeat let block = between (pstring "[") (pstring "]") (many1 (pcommand .>> spaces)) prepeatimpl := pstring "repeat" >>. spaces1 >>. pfloat .>> spaces .>>. block |>> fun (n,commands) -> Repeat(int n, commands)
  • 18. TURTLE INTERPRETER: PATTERN MATCHING let rec perform turtle = function | Forward n -> let r = float turtle.A * Math.PI / 180.0 let dx, dy = float n * cos r, float n * sin r let x, y = turtle.X, turtle.Y let x',y' = x + dx, y + dy drawLine (x,y) (x',y') { turtle with X = x'; Y = y' } | Turn n -> { turtle with A = turtle.A + n } | Repeat (n, commands) -> let rec repeat turtle = function | 0 -> turtle | n -> repeat (performAll turtle commands) (n-1) repeat turtle n and performAll = List.fold perform
  • 19. TURTLE: PROCEDURES to square repeat 4 [forward 50 right 90] end to flower repeat 36 [right 10 square] end to garden repeat 25 [set-random-position flower] end garden
  • 20. SMALL BASIC COMPILER FParsec Hands On F#unctional Londoners 2014
  • 21. SMALL BASIC IDE FParsec Hands On F#unctional Londoners 2014
  • 22. SMALL BASIC SAMPLE Sub Init gw = 598 gh = 428 GraphicsWindow.BackgroundColor = "DodgerBlue" GraphicsWindow.Width = gw GraphicsWindow.Height = gh color = "1=Orange;2=Cyan;3=Lime;" size = "1=20;2=16;3=12;" passed = 0 cd = "False" ' collision detected EndSub
  • 23. SMALL BASIC AST /// Small Basic expression type expr = | Literal of value | Identifier of identifier | GetAt of location | Func of invoke | Neg of expr | Arithmetic of expr * arithmetic * expr | Comparison of expr * comparison * expr | Logical of expr * logical * expr /// Small Basic instruction type instruction = | Assign of assign | SetAt of location * expr | PropertySet of string * string * expr | Action of invoke | For of assign * expr * expr | EndFor | If of expr | ElseIf of expr | Else | EndIf | While of expr | EndWhile | Sub of identifier * string list | EndSub | Label of label | Goto of label
  • 24. SMALL BASIC PARSER /// > For i = 1 To 100 Step 2 let pfor = let pfrom = str_ws1 "For" >>. pset let pto = str_ws1 "To" >>. pexpr let pstep = str_ws1 "Step" >>. pexpr let toStep = function None -> Literal(Int(1)) | Some s -> s pipe3 pfrom pto (opt pstep) (fun f t s -> For(f, t, toStep s)) let pendfor = str_ws "EndFor" |>> (fun _ -> EndFor)
  • 25. SMALL BASIC COMPILER: GOTO | Goto(name) -> let label = obtainLabel il name il.Emit(OpCodes.Br, label) | Label(name) -> let label = obtainLabel il name il.MarkLabel(label)
  • 27. F# KOANS [<Koan>] let SquareEvenNumbersWithPipelineOperator() = (* In F#, you can use the pipeline operator to get the benefit of the parens style with the readability of the statement style. *) let result = [0..5] |> List.filter isEven |> List.map square AssertEquality result __

Editor's Notes

  • #2: http://www.quanttec.com/fparsec/about/fparsec-vs-alternatives.html https://bitbucket.org/fparsec/main/src/c234349e7b738e09a1b9eb53f5f1ef77d584f09b/Samples/Tutorial/tutorial.fs?at=default
  • #3: https://twitter.com/ptrelford/status/444399378217062400
  • #4: http://fsharp.github.io/FAKE/ http://lefthandedgoat.github.io/canopy/
  • #7: http://fsprojects.github.io/FsLexYacc/
  • #10: https://github.com/ZachBray/FunScript/blob/master/src/extra/FunScript.TypeScript/Parser.fs https://github.com/borisyankov/DefinitelyTyped/blob/master/jquery/jquery.d.ts
  • #11: https://bitbucket.org/fparsec/main/src/c234349e7b738e09a1b9eb53f5f1ef77d584f09b/Samples/Tutorial/tutorial.fs?at=default
  • #12: https://bitbucket.org/fparsec/main/src/c234349e7b738e09a1b9eb53f5f1ef77d584f09b/Samples/Calculator/calculator.fs?at=default
  • #13: http://fssnip.net/nM
  • #15: http://blogs.msdn.com/b/smallbasic/archive/2014/08/11/small-basic-game-programming-vertical-scrolling-game.aspx
  • #20: http://fssnip.net/nN
  • #21: https://bitbucket.org/ptrelford/smallbasiccompiler
  • #22: http://trelford.com/blog/post/fart.aspx
  • #23: http://blogs.msdn.com/b/smallbasic/archive/2014/08/11/small-basic-game-programming-vertical-scrolling-game.aspx