Writing An Interpreter In Go
Changelog
Unreleased
- Section 2.3:
- Correct spelling of “Earley parsing” (from “Early parsing”)
- Section 2.6:
- Remove confusing sentence about nil-checks
- Change vague sentence about precedence in parsing for-loop
- Section 3.5:
- Section 3.7:
- Change description of
evalStatement
, that erroneously
described it as a function used by evalProgramStatements
and evalBlockStatements
(which both don’t exist)
- Section 4.2:
- Fix a typo by changing “in” to “into”
- Section 4.3:
- Adding missing test output for failing
len
test
7 May 2020 - 1.7
- Code:
- Added
go.mod
files to the code folder so that users
with Go >= 1.13 can easily run it without having to set
$GOPATH
- Section 1.5:
- Update wrong token types in example Lexer output
- Change from
fmt.Printf
to fmt.Fprintf
to
make use of out
- Section 1.3:
- Fix a grammar mistake by removing the additional “the” in “Of the
course”
- Section 2.9:
- Fix a typo by changing “intends” to “indents”
- Section 3.9:
- Change “How to we” to “How do we”
- Fix missing word in “we should bind it too” by rewriting
sentence
20 March 2019 - 1.6
- Section 2.4:
- Fix wrong
parseOperatorExpression
in pseudo-code
example for recursive-descent parser
- Section 2.5:
- Change wrong capitalization in test error message
- Section 4.5:
- Correct explanation of
HashKey
by clarifying that
ObjectType
is a string
(as opposed to an
integer)
31 July 2018 - 1.5
Besides fixes for various typos and spelling errors:
- Chapter 2:
- Fix wrong mention of
program.Body
in test error
messages and change it to program.Statements
- Section 1.3:
- Make it clearer where to put
import "monkey/token"
line
- Section 2.4:
- Fix wrong error message in
testLetStatement
helper
function
- Fix wrong indentation of
input
in test function
- Fix missing imports of
fmt
package
- Section 2.5:
- Fix wrong mention of
ParseProgram
instead of the
correct parseStatement
- Section 2.6:
- Fix wrong explanation of failing test output in prefix operators
section
- Fix wrong explanation of the for-loop condition in
parseExpression
- Rename local variable
oe
to ie
in
*ast.InfixExpression
methods
- Section 2.8:
- Change post-refactoring version of
TestParsingInfixExpressions
to make clearer that it has
been refactored
- Fix wrong error message in
testInfixExpression
- Fix wrong output in test error message (“true” to “TRUE”)
- Add missing import of
strings
package
- Change wording to make clearer that the section includes changes to
the existing test suite
- Section 2.9:
- Add the missing
import
of monkey/parser
to
the REPL code
- Section 3.5:
- Fix wrong error message in failing test output for
TestEvalBooleanExpression
- Section 3.8:
- Add missing import of
fmt
- Section 3.10:
- Chapter 4:
- Remove unused import of
unicode/utf8
package
- Section 4.5:
- Add note about hash collisions when explaining the
HashKey
methods
- Fix wrong failing test output after adding a test to
TestErrorHandling
- Going Further:
- Add link to the sequel Writing A Compiler In Go.
28 June 2017 - 1.4
- Section 1.4:
- Use a local variable to save the
literal
when creating
token.EQ
and token.NOT_EQ
- Section 2.3:
- Section 2.4:
- Change incorrect mention of
peekPosition
in lexer to
correct readPosition
- Section 2.6:
- Fix duplicate test input in
TestOperatorPrecedenceParsing
here and in the following
sections where it’s referenced
- Section 3.9:
- In the first example the expression
5 * 5
was used and
the text explained that this should evaluate to 10
, which
is wrong. It should evaluate to 25
, of course.
- The Lost Chapter:
- Added a new section at the end of the book about The Lost
Chapter: A Macro System For Monkey and where it can be found.
26 January 2017 - 1.3
- License of the code:
- The
code
folder and its content are now licensed under
the MIT license. See the LICENSE
file and/or the
README.md
file.
- Section 1.1:
- Make clear that whitespace is only significant in the sense that it
separates tokens, but not its length.
- Section 1.3:
- Small wording change
- Fix wrong reference to
NextToken
when
readChar
was meant
- Section 2.8:
- Fix the
parseBlockStatement
method so it doesn’t run
into an endless loop when parsing incomplete input
- Section 4.2:
- Fix the
readString
method so it doesn’t run into an
endless loop when a string in the input is not terminated with a closing
double quote
- Section 4.4:
- Fix a typo in the error message of the builtin
push
function
20 December 2016 - 1.2
- Section 2.8:
- Add a missing semicolon to the test input in
TestLetStatements
- Section 4.4:
- Fix the failing test for the builtin
push
function.
Error was introduced with the last update. This change only occurrs in
the code accompanying the book and only in subfolder
04
.
8 December 2016 - 1.1
Besides fixed typos and spelling errors:
- Introduction
- Change the “How To Use This Book” subsection to include a link to
the downloadable archive of the accompanying code
- Section 1.4:
- Add hint about accompanying code
- Show the last, fully extended version of the test
input
for TestNextToken
- Section 2.6:
- The failing test output for
TestParsingPrefixExpressions
in the book text was wrong.
It’s corrected to match the actual output one gets when building the
parser from scratch
- Fix wording that didn’t match the described test output
- Remove
token.LPAREN
from the precedences
table here. It somehow slipped in at this point, but should only be
added later on in section 2.8, where tests are supposed to fail because
it’s missing
- Section 2.8:
- Fix wrong test expectation (
"x"
changed to
"y"
) in TestLetStatement
- Change
parser_parser_test.go
to
parser_test.go
- Better show how to use
testLiteralExpression
in
TestParsingInfixExpressions
- Fix outdated test output for failing
TestOperatorPrecedenceParsing
,
TestIfExpression
, TestIfElseExpression
,
TestFunctionLiteralParsing
- Section 3.10:
- Change the
Inspect()
method of
*object.Function
to use fn
instead of
function
and newlines in output
- Remove needless semicolons in example
- Section 3.5:
- Change from if/else to “if and return” in
nativeBoolToBooleanObject
- Section 3.6:
- Update the version of
testNullObject
to be the one in
the accompanying code, with a correct call to t.Errorf
- Section 4.4:
- Name the
token.Token
field of
ast.ArrayLiteral
- Fix possible panic through nil error in “first”, “last”, “rest”, and
“push” functions by adding separate check
- Section 4.5:
- Name the
token.Token
field of
ast.HashLiteral
- Replace
null
in output with missing error message when
trying to access hash via index expression before it’s implemented
- Section 4.6:
- Change the expected output using
puts
with a function
literal to match the updated Inspect()
of
*object.Function
- Explain the
null
s in the expected output of
put
better
23 November 2016 - 1.0