Developing an Interpreter Using GO and C# with Roslyn SDK

Writing an Interpreter in 
GO
 C#
Tim Boyle
.Net Oxford
14
th
 May 2019
interpreterbook.com
Overview
Roslyn API Template
Syntax Visualizer
Simple Interpreter
Code Fixes
Roslyn SDK
Template
Code Fixes / Analyzers
Code Fixes / Analyzers
Code Fixes / Analyzers
Code Fixes / Analyzers
Code Fixes / Analyzers
Code Fixes / Analyzers
Code Fixes / Analyzers
Syntax
Visualizer
Interpreter
Source Code
Tokens
Abstract Syntax
Tree (AST)
Parsing
Evaluation
Lexical Analysis
This Photo
 by
Unknown Author is
licensed under 
CC BY-
SA
Lexical Analysis
Chop up text into pieces which are
more meaningful to the parser
These pieces are called 
tokens
Lexing
let answer = 40 + 2;
Lexing
l
et answer = 40 + 2;
Lexing
let
 answer = 40 + 2;
Lexing
let
 answer = 40 + 2;
LET
Lexing
let
 
answer = 40 + 2;
LET
Lexing
let
 
answer
 = 40 + 2;
LET
Lexing
let
 
answer
 = 40 + 2;
LET
IDENTIFIER("answer")
Lexing
let
 
answer
 
=
 40 + 2;
LET
IDENTIFIER("answer")
Lexing
let
 
answer
 
=
 40 + 2;
LET
IDENTIFIER("answer")
EQUAL_SIGN
Lexing
let
 
answer
 
=
 
4
0 + 2;
LET
IDENTIFIER("answer")
EQUAL_SIGN
Lexing
let
 
answer
 
=
 
40
 + 2;
LET
IDENTIFIER("answer")
EQUAL_SIGN
Lexing
let
 
answer
 
=
 
40
 + 2;
LET
IDENTIFIER("answer")
EQUAL_SIGN
INTEGER(40)
Lexing
let
 
answer
 
=
 
40
 
+
 2;
LET
IDENTIFIER("answer")
EQUAL_SIGN
INTEGER(40)
Lexing
let
 
answer
 
=
 
40
 
+
 2;
LET
IDENTIFIER("answer")
EQUAL_SIGN
INTEGER(40)
PLUS_SIGN
Lexing
let
 
answer
 
=
 
40
 
+
 
2
;
LET
IDENTIFIER("answer")
EQUAL_SIGN
INTEGER(40)
PLUS_SIGN
Lexing
let
 
answer
 
=
 
40
 
+
 
2
;
LET
IDENTIFIER("answer")
EQUAL_SIGN
INTEGER(40)
PLUS_SIGN
INTEGER(2)
Lexing
let
 
answer
 
=
 
40
 
+
 
2
;
LET
IDENTIFIER("answer")
EQUAL_SIGN
INTEGER(40)
PLUS_SIGN
INTEGER(2)
Lexing
let
 
answer
 
=
 
40
 
+
 
2
;
LET
IDENTIFIER("answer")
EQUAL_SIGN
INTEGER(40)
PLUS_SIGN
INTEGER(2)
SEMICOLON
Lexing
let
 
answer
 
=
 
40
 
+
 
2;
LET
IDENTIFIER("answer")
EQUAL_SIGN
INTEGER(40)
PLUS_SIGN
INTEGER(2)
SEMICOLON
Lexing
let
 
answer
 
=
 
40
 
+
 
2;
LET
IDENTIFIER("answer")
EQUAL_SIGN
INTEGER(40)
PLUS_SIGN
INTEGER(2)
SEMICOLON
EOF
Lexing
let
 
answer
 
=
 
40
 
+
 
2;
LET
IDENTIFIER("answer")
EQUAL_SIGN
INTEGER(40)
PLUS_SIGN
INTEGER(2)
SEMICOLON
EOF
Parsing
Parser takes input data and builds
a data structure giving a structural
representation of the input, checking
for correct syntax in the process.
Wikipedia
Parsing
let
 
answer
 
=
 
40
 
+
 
2;
LET
IDENTIFIER("answer")
EQUAL_SIGN
INTEGER(40)
PLUS_SIGN
INTEGER(2)
SEMICOLON
EOF
Parsing
let
 
answer
 
=
 
40
 
+
 
2;
LET
IDENTIFIER("answer")
EQUAL_SIGN
INTEGER(40)
PLUS_SIGN
INTEGER(2)
SEMICOLON
EOF
Parsing
let
 
answer
 
=
 
40
 
+
 
2;
LET
IDENTIFIER("answer")
EQUAL_SIGN
INTEGER(40)
PLUS_SIGN
INTEGER(2)
SEMICOLON
EOF
Parsing
let
 
answer
 
=
 
40
 
+
 
2;
LET
IDENTIFIER("answer")
EQUAL_SIGN
INTEGER(40)
PLUS_SIGN
INTEGER(2)
SEMICOLON
EOF
Parsing
let
 
answer
 
=
 
40
 
+
 
2;
LET
IDENTIFIER("answer")
EQUAL_SIGN
INTEGER(40)
PLUS_SIGN
INTEGER(2)
SEMICOLON
EOF
Parsing
let
 
answer
 
=
 
40
 
+
 
2;
LET
IDENTIFIER("answer")
EQUAL_SIGN
INTEGER(40)
PLUS_SIGN
INTEGER(2)
SEMICOLON
EOF
Parsing
let
 
answer
 
=
 
40
 
+
 
2;
LET
IDENTIFIER("answer")
EQUAL_SIGN
INTEGER(40)
PLUS_SIGN
INTEGER(2)
SEMICOLON
EOF
Parsing
let
 
answer
 
=
 
40
 
+
 
2;
LET
IDENTIFIER("answer")
EQUAL_SIGN
INTEGER(40)
PLUS_SIGN
INTEGER(2)
SEMICOLON
EOF
Parsing
let
 
answer
 
=
 
40
 
+
 
2;
LET
IDENTIFIER("answer")
EQUAL_SIGN
INTEGER(40)
PLUS_SIGN
INTEGER(2)
SEMICOLON
EOF
Parsing
let
 
answer
 
=
 
40
 
+
 
2;
LET
IDENTIFIER("answer")
EQUAL_SIGN
INTEGER(40)
PLUS_SIGN
INTEGER(2)
SEMICOLON
EOF
Parsing
let
 
answer
 
=
 
40
 
+
 
2;
LET
IDENTIFIER("answer")
EQUAL_SIGN
INTEGER(40)
PLUS_SIGN
INTEGER(2)
SEMICOLON
EOF
Parsing
let
 
answer
 
=
 
40
 
+
 
2;
LET
IDENTIFIER("answer")
EQUAL_SIGN
INTEGER(40)
PLUS_SIGN
INTEGER(2)
SEMICOLON
EOF
Parsing
let
 
answer
 
=
 
40
 
+
 
2;
LET
IDENTIFIER("answer")
EQUAL_SIGN
INTEGER(40)
PLUS_SIGN
INTEGER(2)
SEMICOLON
EOF
Parsing
let
 
answer
 
=
 
40
 
+
 
2;
Roslyn
 
LET
IDENTIFIER("answer")
EQUAL_SIGN
INTEGER(40)
PLUS_SIGN
INTEGER(2)
SEMICOLON
EOF
Syntax Visualizer
let
 
answer
 
=
 
40
 
+
 
2;
INT
IDENTIFIER("answer")
EQUAL_SIGN
INTEGER(40)
PLUS_SIGN
INTEGER(2)
SEMICOLON
EOF
Syntax Visualizer
int
 
answer
 
=
 
40
 
+
 
2;
INT
IDENTIFIER("answer")
EQUAL_SIGN
INTEGER(40)
PLUS_SIGN
INTEGER(2)
SEMICOLON
EOF
Visual Studio
int
 
answer
 
=
 
40
 
+
 
2;
INT
IDENTIFIER("answer")
EQUAL_SIGN
INTEGER(40)
PLUS_SIGN
INTEGER(2)
SEMICOLON
EOF
Visual Studio
 
Visual Studio
int
 
answer
 
=
 
40
 
+
 
2;
Syntax
Visualizer
Code Fixes
 
LET
IDENTIFIER("answer")
EQUAL_SIGN
INTEGER(40)
PLUS_SIGN
INTEGER(2)
SEMICOLON
EOF
Abstract Syntax Tree
let
 
answer
 
=
 
40
 
+
 
2;
LET
IDENTIFIER("answer")
EQUAL_SIGN
INTEGER(40)
PLUS_SIGN
INTEGER(2)
SEMICOLON
EOF
Abstract Syntax Tree
let
 
answer
 
=
 
40 + 2
;
LET
IDENTIFIER("answer")
EQUAL_SIGN
INTEGER(42)
SEMICOLON
EOF
Abstract Syntax Tree
let
 
answer
 
=
 
42
;
Thank You
interpreterbook.com
compilerbook.com
 
pluralsight.com
Slide Note

Good evening. My name is Tim Boyle and I am going to talk to you about some basic interpreter theory that I have gleaned from this book

Build up interpreter

Why Go?

In C# - not going to talk

Apologise if title misleading

But if you are interested – get the book!

Embed
Share

Exploring the process of creating an interpreter in GO and C# with the help of the Roslyn SDK, focusing on templates, syntax visualization, building a simple interpreter, and implementing code fixes and analyzers. The journey covers essential aspects such as the Roslyn SDK, template utilization, and enhancing code quality through fixes and analyzers.


Uploaded on Sep 23, 2024 | 2 Views


Download Presentation

Please find below an Image/Link to download the presentation.

The content on the website is provided AS IS for your information and personal use only. It may not be sold, licensed, or shared on other websites without obtaining consent from the author. Download presentation by click this link. If you encounter any issues during the download, it is possible that the publisher has removed the file from their server.

E N D

Presentation Transcript


  1. Writing an Interpreter in GO C# Tim Boyle .Net Oxford 14thMay 2019 interpreterbook.com

  2. Roslyn API Template Syntax Visualizer Simple Interpreter Code Fixes Overview

  3. Roslyn SDK

  4. Template

  5. Code Fixes / Analyzers

  6. Code Fixes / Analyzers

  7. Code Fixes / Analyzers

  8. Code Fixes / Analyzers

  9. Code Fixes / Analyzers

  10. Code Fixes / Analyzers

  11. Code Fixes / Analyzers

  12. Syntax Visualizer

  13. Interpreter Abstract Syntax Tree (AST) Source Code Tokens Evaluation Lexical Analysis Parsing

  14. Chop up text into pieces which are more meaningful to the parser These pieces are called tokens Lexical Analysis

  15. Lexing let answer = 40 + 2;

  16. Lexing let answer = 40 + 2;

  17. Lexing let answer = 40 + 2;

  18. Lexing LET let answer = 40 + 2;

  19. Lexing LET let answer = 40 + 2;

  20. Lexing LET let answer = 40 + 2;

  21. Lexing LET IDENTIFIER("answer") let answer = 40 + 2;

  22. Lexing LET IDENTIFIER("answer") let answer = 40 + 2;

  23. Lexing LET IDENTIFIER("answer") EQUAL_SIGN let answer = 40 + 2;

  24. Lexing LET IDENTIFIER("answer") EQUAL_SIGN let answer = 40 + 2;

  25. Lexing LET IDENTIFIER("answer") EQUAL_SIGN let answer = 40 + 2;

  26. Lexing LET IDENTIFIER("answer") EQUAL_SIGN INTEGER(40) let answer = 40 + 2;

  27. Lexing LET IDENTIFIER("answer") EQUAL_SIGN INTEGER(40) let answer = 40 + 2;

  28. Lexing LET IDENTIFIER("answer") EQUAL_SIGN INTEGER(40) PLUS_SIGN let answer = 40 + 2;

  29. Lexing LET IDENTIFIER("answer") EQUAL_SIGN INTEGER(40) PLUS_SIGN let answer = 40 + 2;

  30. Lexing LET IDENTIFIER("answer") EQUAL_SIGN INTEGER(40) PLUS_SIGN INTEGER(2) let answer = 40 + 2;

  31. Lexing LET IDENTIFIER("answer") EQUAL_SIGN INTEGER(40) PLUS_SIGN INTEGER(2) let answer = 40 + 2;

  32. Lexing LET IDENTIFIER("answer") EQUAL_SIGN INTEGER(40) PLUS_SIGN INTEGER(2) SEMICOLON let answer = 40 + 2;

  33. Lexing LET IDENTIFIER("answer") EQUAL_SIGN INTEGER(40) PLUS_SIGN INTEGER(2) SEMICOLON let answer = 40 + 2;

  34. Lexing LET IDENTIFIER("answer") EQUAL_SIGN INTEGER(40) PLUS_SIGN INTEGER(2) SEMICOLON EOF let answer = 40 + 2;

  35. Lexing LET IDENTIFIER("answer") EQUAL_SIGN INTEGER(40) PLUS_SIGN INTEGER(2) SEMICOLON EOF let answer = 40 + 2;

  36. Parser takes input data and builds a data structure giving a structural representation of the input, checking for correct syntax in the process. Parsing Wikipedia

  37. Parsing let answer = 40 + 2;

  38. Parsing let answer = 40 + 2; LET IDENTIFIER("answer") EQUAL_SIGN INTEGER(40) PLUS_SIGN INTEGER(2) SEMICOLON EOF

  39. Parsing let answer = 40 + 2; Program Statements[] LET IDENTIFIER("answer") EQUAL_SIGN INTEGER(40) PLUS_SIGN INTEGER(2) SEMICOLON EOF

  40. Parsing let answer = 40 + 2; Program Statements[] LET IDENTIFIER("answer") EQUAL_SIGN INTEGER(40) PLUS_SIGN INTEGER(2) SEMICOLON EOF LetStatement Name Value

  41. Parsing let answer = 40 + 2; Program Statements[] LET IDENTIFIER("answer") EQUAL_SIGN INTEGER(40) PLUS_SIGN INTEGER(2) SEMICOLON EOF LetStatement Name Value Identifier Value

  42. Parsing let answer = 40 + 2; Program Statements[] LET IDENTIFIER("answer") EQUAL_SIGN INTEGER(40) PLUS_SIGN INTEGER(2) SEMICOLON EOF LetStatement Name Value Identifier Value : "answer"

  43. Parsing let answer = 40 + 2; Program Statements[] LET IDENTIFIER("answer") EQUAL_SIGN INTEGER(40) PLUS_SIGN INTEGER(2) SEMICOLON EOF LetStatement Name Value Identifier Value : "answer"

  44. Parsing let answer = 40 + 2; Program Statements[] LET IDENTIFIER("answer") EQUAL_SIGN INTEGER(40) PLUS_SIGN INTEGER(2) SEMICOLON EOF LetStatement Name Value Identifier Value : "answer" IntegerLiteral Value: 40

  45. Parsing let answer = 40 + 2; Program Statements[] LET IDENTIFIER("answer") EQUAL_SIGN INTEGER(40) PLUS_SIGN INTEGER(2) SEMICOLON EOF LetStatement Name Value InfixExpression LHS RHS Identifier Value : "answer" IntegerLiteral Value: 40

  46. Parsing let answer = 40 + 2; Program Statements[] LET IDENTIFIER("answer") EQUAL_SIGN INTEGER(40) PLUS_SIGN INTEGER(2) SEMICOLON EOF LetStatement Name Value InfixExpression LHS RHS Identifier Value : "answer" IntegerLiteral Value: 40

  47. Parsing let answer = 40 + 2; Program Statements[] LET IDENTIFIER("answer") EQUAL_SIGN INTEGER(40) PLUS_SIGN INTEGER(2) SEMICOLON EOF LetStatement Name Value InfixExpression LHS RHS Identifier Value : "answer" IntegerLiteral IntegerLiteral Value: 40 Value: 2

  48. Parsing let answer = 40 + 2; Program Statements[] LET IDENTIFIER("answer") EQUAL_SIGN INTEGER(40) PLUS_SIGN INTEGER(2) SEMICOLON EOF LetStatement Name Value InfixExpression LHS RHS Identifier Value : "answer" IntegerLiteral IntegerLiteral Value: 40 Value: 2

  49. Parsing let answer = 40 + 2; Program Statements[] LET IDENTIFIER("answer") EQUAL_SIGN INTEGER(40) PLUS_SIGN INTEGER(2) SEMICOLON EOF LetStatement Name Value InfixExpression LHS RHS Identifier Value : "answer" IntegerLiteral IntegerLiteral Value: 40 Value: 2

  50. Parsing let answer = 40 + 2; Program Statements[] LET IDENTIFIER("answer") EQUAL_SIGN INTEGER(40) PLUS_SIGN INTEGER(2) SEMICOLON EOF LetStatement Name Value InfixExpression LHS RHS Identifier Value : "answer" IntegerLiteral IntegerLiteral Value: 40 Value: 2

Related


More Related Content

giItT1WQy@!-/#giItT1WQy@!-/#giItT1WQy@!-/#giItT1WQy@!-/#giItT1WQy@!-/#