Slide 1

Slide 1 text

Creating A Programming Language integer minutes = 45;

Slide 2

Slide 2 text

Grammar

Slide 3

Slide 3 text

Grammar → Rules which define structure/syntax sentence : subject verb object | subject verb → Each rule is called a lexeme sentence is a lexeme, subject is a lexeme etc. definition : type identifier = value | type identifier

Slide 4

Slide 4 text

Lexer

Slide 5

Slide 5 text

Lexer → Breaks a code string into tokens /(integer)/ = ["type", "integer"] → Ignores code heirarchy ["if"], ["("], ["identifier", "x"], ["=="], ["number", "5"]... ["type", "integer"], ["identifier", "minutes"], ["assign"], ...

Slide 6

Slide 6 text

Parser

Slide 7

Slide 7 text

Parser → Arranges tokens into a heirarchy ["if", ["equals", [["identifier", "x"], ["number", "5"]]]]... → Checks tokens for syntax errors Parse error: parse error, expecting T_PAAMAYIM_NEKUDOTAYIM ["definition", [["type", "number"], ["identifier", "minutes"], ["number", "45"]]]

Slide 8

Slide 8 text

Abstract Syntax Tree

Slide 9

Slide 9 text

Abstract Syntax Tree → Represents constructs in the compiler's language new While($conditionTokens, $bodyTokens) new Definition($typeToken, $identifierToken, $valueToken)

Slide 10

Slide 10 text

Interpreter

Slide 11

Slide 11 text

Interpreter → Calculates an immediate effect $foreach->affect($context) → Always accepts and returns a context $definition->applyToContext($context)

Slide 12

Slide 12 text

Compiler

Slide 13

Slide 13 text

Compiler → Writes the Abstract Syntax Tree into a new language $compiler->render($switch) → Also checks nodes for syntax errors in target language $definition->renderWithContext($context)

Slide 14

Slide 14 text

All together!

Slide 15

Slide 15 text

All together! → integer minutes = 45 → ["type", "integer"], ["identifier", "minutes"], ["assign"], ["number", "45"] → ["definition", [["type", "number"], ["identifier", "minutes"], ["number", "45"]]] → new Definition($typeToken, $identifierToken, $valueToken) → $definition->renderWithContext($context) $minutes = 45;