Start working on a mini parser for IDL expression.
Lexer mostly works. Unit test is not yet implemented. Dict has a problem
with initialization where it cannot process the keys without overriding
the init function. However no variadic positional parameters can be used
if init is overridden.
Dict can now takes a hash as argument and consume its content.
Add = character lexing in exprparser.
Some more notes about the difficulty and how the scope should be
limited.
Rename to lexer to make it clear the separation between lexer and
parser.

Add lexer unit test.
Start working on a parser.

The parser will not be fully compatible to IDL's, especially regarding
to operator precedence. It takes ideas from other modern languages to
make the syntax less cumbersome, such as chained method calls.
Parser now builds AST correctly for simple expressions (no support
for functions, arrays, dictionary, objects yet). Basic calculations
are working.
Start working on more complicated functions, subscripts and dot notation.
Add src directory for better file organisation.
All parse functions are implemented (not tested yet).

Need a good way to manage common resources, token codes, line, error
etc across lexer, parser and interpreter.
AstNode now has start position from lexer as the first argument to
initialization.
All AstNode instances keep a copy of TOKEN as a workaround for global
variables. It is not memory efficient. But memory is not a concern for
this project anyway.
Add dictionary__define so the program can run with IDL 8.2
All AstNode subclass now renamed as XXXNode to clearly indicate they are
AstNode.
Add eval unit tests and fix various bugs along the way.
Add sysvar node to deal with system variables. Note !NULL is dealt
separately with the dedicate NullNode.
Working on dimension concatenation. A bit tricky to get all compatible
with IDL's implementation while allow higher order of brackets.
Add ArrayLiteralNode to build array literals with the help from
arrayconcat to perform high order dimension array concatenation.

ListNode now only does the job for list and hash (no more array). A new
parse_array_literal function is added to parser. Add unit tests for
ensure the output of arrayconcat has correct dimensions.  All tests are
passed so far.
Working on subscript. Add a WildcardNode for using * as indices. Now all
components in parse tree are of AstNode class. Fix a bug where the token
stream is not advanced after parsing a * index.
Array subscript seems working. Need the helper function for
taking slices along a given dimension. Need more tests.

Whether the indices are range has to be taken care of separately.
More unit tests for array subscripting added and passed.
The dictionary init function now accepts up to 64 key/value pairs for
convenience during instantiation.
Add func and method call support. Up to 9 positional arguments and
unlimited input keyword arguments are supported.

Unit tests still need to be added.
Add member access for structure and Hash like objects. Generic object
property access does not seem to be possible.