Store tree nodes in congruent, compact arena array. Define handle types to refer to tree nodes rather than pointers to structure instances. Free tree with context.
7.1 KiB
7.1 KiB
v5.0.0
API Changes
- Tree generation mode now stores all tree nodes in a compact arena owned by the parser context (a flat node array plus a shared child-link array). This replaces the previous design of one heap allocation per node with layout-punned typed structs.
- Tree nodes are now referenced by lightweight handles rather than pointers.
p_result()and the field accessors return handle values. - The whole tree is freed together with the context by
p_context_delete(). Thep_tree_delete()/p_tree_delete_XXX()functions have been removed; tree node handles are only valid while the context is alive. - Tree node field access changed per target language:
- C: per-field accessor functions (e.g.
p_Start_pItems(node)) plus tree walk macros (e.g.p_tree_walk_Start(node, pItems, pItem, pToken1, token)), and generic accessorsp_node_valid(),p_node_position(),p_node_end_position(),p_node_n_fields(),p_node_data(),p_node_id(). - C++: handle methods called with
()(e.g.node.pItems().pToken1().token()), plus the same C-style functions/macros for convenience. - D:
@propertyaccessors preserving the previous field-access syntax (e.g.node.pItems.pToken1.token); null checks use.validinstead ofis null.
- C: per-field accessor functions (e.g.
- Tree-mode parser rule user code:
$$and$1etc. now yield node handles. Reference child fields through the target-language accessors described above rather than through struct pointer members.
v4.8.1
Fixes
- Fix tree node struct type forward-declarations for C/C++
v4.8.0
New Features
- Add
p_parse_inner_XXX()APIs that accept a caller-provided set of follow tokens. These behave the same asp_parse_XXX()by parsing starting at the given start rule, but instead of expecting the rest of the input to match the start rule they allow specifying a set of tokens that may follow the start rule. - Add
p_set_position()API to set the current text position stored in the context. Useful for setting the initial text position to something other than(1, 1)for a nested parse operation. - Add
p_input_index()API to get the current input text byte offset. - Add
p_set_input_index()API to set the current input text byte offset. Useful together withp_set_position()to rewind the input part-way through a parse in order to re-read an earlier section of the input.
v4.7.0
New Features
- Support parser rule user code blocks in tree generation mode.
Fixes
- propane.vim: do not highlight rule components as propane keywords
v4.6.0
New Features
- Add lexer user code API to access matched input text positions
- Track rule component text positions and add parser user code API to access
Fixes
- Fixed a few user guide and source comments related to text input positions
v4.5.0
New Features
- Add
nolinegrammar statement to skip emitting#linedirectives - Attempt to autodetect target language (D/C++) in extra/vim/syntax/propane.vim
Fixes
- Fix #line reset directives
- Update keyword list in extra/vim/syntax/propane.vim
- Fix propane.vim keyword detection
v4.4.0
New Features
- Add p_value_get() / p_value_get_XXX() accessors
v4.3.0
New Features
- Use #line for user code blocks to report input grammar position for errors.
v4.2.0
New Features
- Add support for a custom lex function.
v4.1.0
New Features
- Add
p_context_delete()andp_tree_delete()for D targets.
v4.0.0
New Features
- Add
context_user_fieldsstatement to allow custom context user fields. - Add
token_user_fieldsstatement to allow custom token user fields. - Add
on_token_nodestatement to allow custom code when constructing token nodes. - Add
free_token_nodestatement to allow custom code when freeing token nodes. - Add
p_context_delete(). - Allow
droppatterns to execute lexer user code blocks.
Breaking Changes
- Replace
p_context_init()withp_context_new()andp_context_delete(). - Renamed
p_free_tree()top_tree_delete(). - The
free_token_nodestatement now takes a user code block instead of a function name parameter.
v3.0.0
New Features
- Add support for multiple starting rules (#38)
- Add
p_free_tree()functions to reclaim generated tree memory - Add
free_token_nodegrammar statement to reclaim user-allocated memory stored in a Token tree nodepvaluefield - Add valgrind memory leak tests to unit tests
- Fix build issues for C++ to officially support C++ target output
Improvements
- Document
p_lex()andp_token_info_tin user guide (#37)
Breaking Changes
- Rename AST generation mode to tree generation mode (see UPGRADING.md)
v2.3.0
New Features
- Add \D, \S, \w, \W special character classes
Improvements
- Include line numbers for pattern errors
- Improve performance in a few places
- Parallelize parser table generation on Linux hosts
- Add github workflow to run unit tests
Fixes
- Fix a couple clang warnings for C backend
- Fix C backend not fully initializing pvalues when multiple ptypes are used with different sizes.
- Fix some user guide examples
v2.2.1
Fixes
- Fix GC issue for D backend when AST is enabled (#36)
v2.2.0
Improvements
- Allow multiple lexer modes to be specified for a lexer pattern (#35)
- Document p_decode_code_point() API function (#34)
v2.1.1
Fixes
- Field aliases for AST node fields could alias incorrect field when multiple rule alternatives present for one rule set (#33)
v2.1.0
Improvements
- Report rule name and line number for conflicting AST node field positions errors (#32)
v2.0.0
Improvements
- Log conflicting rules on reduce/reduce conflict (#31)
- Use 1-based row and column values for position values (#30)
Fixes
- Fix named optional rules (#29)
Upgrading
- Adjust all uses of p_position_t row and col values to expect 1-based instead of 0-based values.
v1.5.1
Improvements
- Improve performance (#28)
v1.5.0
New Features
- Track start and end text positions for tokens and rules in AST node structures (#27)
- Add warnings for shift/reduce conflicts to log file (#25)
- Add -w command line switch to treat warnings as errors and output to stderr (#26)
- Add rule field aliases (#24)
Improvements
- Show line numbers of rules on conflict (#23)
v1.4.0
New Features
- Allow user to specify AST node name prefix or suffix
- Allow specifying the start rule name
- Allow rule terms to be marked as optional
Improvements
- Give a better error message when a referenced ptype has not been declared
v1.3.0
New Features
- Add AST generation (#22)
v1.2.0
New Features
- Allow one line user code blocks (#21)
- Add backslash escape codes (#19)
- Add API to access unexpected token found (#18)
- Add token_names API (#17)
- Add D example to user guide for p_context_init() (#16)
- Allow user termination from lexer code blocks (#15)
Fixes
- Fix generator hang when state transition cycle is present (#20)
v1.1.0
New Features
- Add user parser terminations (#13)
- Document generated parser API in user guide (#14)
v1.0.0
- Initial release