gsl-shell.git - gsl-shell

index : gsl-shell.git
gsl-shell
summary refs log tree commit diff
path: root/expr-actions.lua
diff options
context:
space:
mode:
Diffstat (limited to 'expr-actions.lua')
-rw-r--r--expr-actions.lua 64
1 files changed, 64 insertions, 0 deletions
diff --git a/expr-actions.lua b/expr-actions.lua
new file mode 100644
index 00000000..3e82cf1c
--- /dev/null
+++ b/expr-actions.lua
@@ -0,0 +1,64 @@
+
+local type = type
+
+local function mult(a, b)
+ if a == 1 then return b end
+ if b == 1 then return a end
+ return {operator= '*', a, b}
+end
+
+local function infix_action(sym, a, b)
+ if sym == '*' then
+ return mult(a, b)
+ else
+ return {operator= sym, a, b}
+ end
+end
+
+local function prefix_action(sym, a)
+ return {operator= sym, a}
+end
+
+local function enum_action(id)
+ return "%" .. id
+end
+
+local function func_eval_action(func_name, arg_expr)
+ return {func = func_name, arg = arg_expr}
+end
+
+local function ident_action(id) return id end
+
+local function literal_action(name)
+ return {literal= name}
+end
+
+-- return true iff expr is a variable (with enums or not).
+-- if it is a variable returns, in addition, the var_name and the enumeration flag
+local function is_variable(expr)
+ if type(expr) == 'string' then
+ local esc_name = string.match(expr, "^%%(.*)")
+ return true, esc_name or expr, (esc_name ~= nil)
+ else
+ return false
+ end
+end
+
+local function is_number(expr)
+ return type(expr) == 'number'
+end
+
+return {
+ infix = infix_action,
+ ident = ident_action,
+ literal = literal_action,
+ prefix = prefix_action,
+ enum = enum_action,
+ func_eval = func_eval_action,
+ number = function(x) return x end,
+ exprlist = function(a, ls) if ls then ls[#ls+1] = a else ls = {a} end; return ls end,
+ schema = function(x, y, conds, enums) return {x= x, y= y, conds= conds, enums= enums} end,
+
+ is_variable = is_variable,
+ is_number = is_number,
+}
generated by cgit v1.2.3 (git 2.25.1) at 2025年09月17日 03:41:26 +0000

AltStyle によって変換されたページ (->オリジナル) /