| # zxdb/expr | |
| This directory handles parsing and evaluating console expressions. These are | |
| what appear in the "print" command, for example. | |
| They are not to be confused with "DWARF expressions" which are small programs | |
| used to evaluate the location of variables. | |
| ## Main Components | |
| _Tokenizer:_ The tokenizer is in `expr_tokenizer.cc` and converts input into a | |
| stream of tokens that can be used by the parser. | |
| _Parser:_ The parser is in `expr_parser.cc` and converts tokens into the | |
| Abstract Syntax Tree. | |
| _Abstract Syntax Tree:_ This tree is in `expr_node.cc` where each `ExprNode` | |
| subclass is a node in the tree. These nodes know how to recursively execute | |
| themselves to produce a result. | |
| _Expression Value:_ The `ExprValue` is in `expr_value.cc` and represents a | |
| value when executing the Abstract Syntax Tree. Each value has a type that | |
| describes it (a reference to the DWARF symbol data) and the binary data | |
| associated with the value. | |
| ## Integration with the outside world | |
| The abstract syntax tree code that executes doesn't actually refer directly to | |
| the symbol data or the running process. Mostly this is to allow better unit | |
| testing. | |
| _Looking up symbols:_ The abstract syntax tree nodes look up variables using | |
| the abstract `EvalContext`. The `EvalContextImpl` is the normal concrete | |
| implementation of this class that references the symbols associated with a | |
| process (`ProcessSymbols`) and provides access to the `SymbolDataProvider` | |
| implementation that reads data from the running process. | |
| ## Helper components | |
| The rest of the code in this directory are helper classes for executing the | |
| syntax tree, in particular for converting names to variable declarations | |
| (`find_variable.*` and `found_*`) and converting various types of variable | |
| accesses to data (`resolve_*`). | |
| An `Identifier` is a parsing of a variable name (or potentially other things | |
| that look like names) and is generated by the parser. The | |
| `TemplateTypeExtractor` helps finding the template parameters in an | |
| `Identifier`. |