SymbolNode class
A SymbolNode object is a member of a tree that contains all possible prefixes of allowable symbols. Multi-character symbols appear in a SymbolNode tree with one node for each character.
For example, the symbol =:~
will appear in a tree as three nodes. The first
node contains an equals sign, and has a child; that child contains a colon and has a child;
this third child contains a tilde, and has no children of its own. If the colon node had
another child for a dollar sign character, then the tree would contain the symbol =:$
.
A tree of SymbolNode objects collaborate to read a (potentially multi-character) symbol from an input stream. A root node with no character of its own finds an initial node that represents the first character in the input. This node looks to see if the next character in the stream matches one of its children. If so, the node delegates its reading task to its child. This approach walks down the tree, pulling symbols from the input that match the path down the tree.
When a node does not have a child that matches the next character, we will have read the longest
possible symbol prefix. This prefix may or may not be a valid symbol.
Consider a tree that has had =:~
added and has not had =:
added.
In this tree, of the three nodes that contain =:~
, only the first and third contain
complete symbols. If, say, the input contains =:a
, the colon node will not have
a child that matches the 'a' and so it will stop reading. The colon node has to "unread": it must
push back its character, and ask its parent to unread. Unreading continues until it reaches
an ancestor that represents a valid symbol.
- Implementers
Constructors
- SymbolNode(SymbolNode? parent, int character)
- Constructs a SymbolNode with the given parent, representing the given character.
Properties
Methods
-
addDescendantLine(
String value, TokenType tokenType) → void - Add a line of descendants that represent the characters in the given string.
-
ancestry(
) → String? - Show the symbol this node represents. Returns The symbol this node represents.
-
deepestRead(
IScanner scanner) → SymbolNode - Find the descendant that takes as many characters as possible from the input.
-
ensureChildWithChar(
int value) → SymbolNode - Find or create a child for the given character.
-
findChildWithChar(
int value) → SymbolNode? - Find a child with the given character.
-
findDescendant(
String value) → SymbolNode? - Find a descendant which is down the path the given string indicates.
-
noSuchMethod(
Invocation invocation) → dynamic -
Invoked when a nonexistent method or property is accessed.
inherited
-
toString(
) → String -
A string representation of this object.
inherited
-
unreadToValid(
IScanner scanner) → SymbolNode - Unwind to a valid node; this node is "valid" if its ancestry represents a complete symbol. If this node is not valid, put back the character and ask the parent to unwind.
Operators
-
operator ==(
Object other) → bool -
The equality operator.
inherited