[
  {"type":"CommentSingle","value":"-- we can define our own structural data types"},
  {"type":"TextWhitespace","value":"\n"},
  {"type":"KeywordReserved","value":"type"},
  {"type":"TextWhitespace","value":" "},
  {"type":"NameClass","value":"Point"},
  {"type":"TextWhitespace","value":" "},
  {"type":"Punctuation","value":"="},
  {"type":"TextWhitespace","value":" "},
  {"type":"Punctuation","value":"{"},
  {"type":"TextWhitespace","value":" "},
  {"type":"NameClass","value":"x"},
  {"type":"Punctuation","value":":"},
  {"type":"TextWhitespace","value":" "},
  {"type":"NameClass","value":"number"},
  {"type":"Punctuation","value":","},
  {"type":"TextWhitespace","value":" "},
  {"type":"NameClass","value":"y"},
  {"type":"Punctuation","value":":"},
  {"type":"TextWhitespace","value":" "},
  {"type":"NameClass","value":"number"},
  {"type":"TextWhitespace","value":" "},
  {"type":"Punctuation","value":"}"},
  {"type":"TextWhitespace","value":"\n"},
  {"type":"CommentSingle","value":"-- and we can annotate variables (and function arguments) with them)"},
  {"type":"TextWhitespace","value":"\n"},
  {"type":"KeywordDeclaration","value":"local"},
  {"type":"TextWhitespace","value":" "},
  {"type":"Name","value":"p"},
  {"type":"Punctuation","value":":"},
  {"type":"TextWhitespace","value":" "},
  {"type":"NameClass","value":"Point"},
  {"type":"TextWhitespace","value":" "},
  {"type":"Operator","value":"="},
  {"type":"TextWhitespace","value":" "},
  {"type":"Punctuation","value":"{"},
  {"type":"TextWhitespace","value":" "},
  {"type":"Name","value":"x"},
  {"type":"TextWhitespace","value":" "},
  {"type":"Operator","value":"="},
  {"type":"TextWhitespace","value":" "},
  {"type":"LiteralNumberFloat","value":"1"},
  {"type":"Punctuation","value":","},
  {"type":"TextWhitespace","value":" "},
  {"type":"Name","value":"y"},
  {"type":"TextWhitespace","value":" "},
  {"type":"Operator","value":"="},
  {"type":"TextWhitespace","value":" "},
  {"type":"LiteralNumberFloat","value":"2"},
  {"type":"TextWhitespace","value":" "},
  {"type":"Punctuation","value":"}"},
  {"type":"TextWhitespace","value":"\n\n"},
  {"type":"NameOther","value":"print"},
  {"type":"Punctuation","value":"("},
  {"type":"Name","value":"p.x"},
  {"type":"Punctuation","value":","},
  {"type":"TextWhitespace","value":" "},
  {"type":"Name","value":"p.y"},
  {"type":"Punctuation","value":")"},
  {"type":"TextWhitespace","value":"\n\n"},
  {"type":"CommentSingle","value":"-- and we can see that accessing an invalid field from a table raises a type error!"},
  {"type":"TextWhitespace","value":"\n"},
  {"type":"NameOther","value":"print"},
  {"type":"Punctuation","value":"("},
  {"type":"Name","value":"p.z"},
  {"type":"Punctuation","value":")"},
  {"type":"TextWhitespace","value":"\n"}
]
