mirror of
https://github.com/rizinorg/rizin
synced 2026-08-22 20:26:16 -04:00
Replace the hand-written parser in calc.c with a tree-sitter grammar (subprojects/rizin-math-parser) and a typed evaluator. The old parser could only ever produce a ut64 and folded anything it failed to read to 0, which left callers unable to tell a failed expression from one that evaluated to zero. Expressions now evaluate to an RzNumValue, a tagged union over ut64, double, RzBitVector, arbitrary-precision integer and arbitrary-precision decimal, carrying an RzNumError rather than signalling failure as 0. Literals keep the width they were written with (5u8, 0xffu128, any width from 1 to 65536), results that outgrow 64 bits promote to a big number on their own, and a parse error, division by zero or unresolved identifier reaches the caller. rz_num_math() is deprecated. rz_num_math_ut64() keeps its exact behaviour for callers that want a ut64, and rz_num_math_value() exposes the typed result. rz_core_math() adds the RzCore-backed form used by the % command, with rz_core_math_ut64() deprecated alongside it. rz-ax routes through the typed API, so it prints values at full precision, reports errors on stderr and exits non-zero. rz_il_lift_num() converts an expression to an RzILOpPure, so a numeric argument can be lifted instead of pre-evaluated. Legacy input still works: trailing base suffixes (101b, 35o, 212t), the trailing-'h' hex form and the k/m/g scale suffixes are all accepted and warn once, pointing at the 0b/0o/0t prefixes. doc/math.md documents the language and doc/math-il-lift.md the lift; the grammar, the evaluator, rz-ax and the % command are covered by unit and db tests.
29 lines
790 B
Meson
29 lines
790 B
Meson
project('rizin-math-parser', 'c',
|
|
license: 'LGPL-3.0-only',
|
|
meson_version: '>=0.55.0',
|
|
)
|
|
|
|
cc = meson.get_compiler('c')
|
|
|
|
if cc.has_argument('--std=c99')
|
|
add_project_arguments('--std=c99', language: ['c'])
|
|
endif
|
|
|
|
tree_sitter_dep = dependency('tree-sitter')
|
|
grammar_js = files('grammar.js')
|
|
tree_sitter_wrap_py = files('meson_tree_sitter_generate.py')
|
|
|
|
subdir('src')
|
|
|
|
libmath_parser = static_library('math_parser', math_parser_files,
|
|
include_directories: math_parser_inc,
|
|
dependencies: tree_sitter_dep.partial_dependency(includes: true),
|
|
implicit_include_directories: true
|
|
)
|
|
|
|
math_parser_dep = declare_dependency(
|
|
link_with: libmath_parser,
|
|
include_directories: math_parser_inc,
|
|
dependencies: tree_sitter_dep
|
|
)
|
|
meson.override_dependency('rizin-math-parser', math_parser_dep)
|