Warning: this is an htmlized version!
The original is here, and the conversion rules are here. |
-- This file: -- http://anggtwu.net/LUA/Ast4.lua.html -- http://anggtwu.net/LUA/Ast4.lua -- (find-angg "LUA/Ast4.lua") -- Author: Eduardo Ochs <eduardoochs@gmail.com> -- -- (defun a3 () (interactive) (find-angg "LUA/Ast4.lua")) -- (defun a4 () (interactive) (find-angg "LUA/Ast4.lua")) -- (code-etv "~/LATEX/") -- (find-code-etv "~/LATEX/") require "Ast3" -- (find-angg "LUA/Ast3.lua") AST.alttags = { eq="=", plus="+", minus="-", Mul="*", div="/", Div="//", pow="^", paren="()", plic="'" } fun = function (name) return AST {[0]="fun", name} end var = function (name) return AST {[0]="var", name} end num = function (str) return AST {[0]="num", str} end bin = function (a, op, b) return AST {[0]=op, a, b} end unary = function (op, a) return AST {[0]=op, a} end paren = function (a) return unary("()", a) end plic = function (a) return unary("'", a) end ap = function (a, b) return bin(a, "ap", b) end eq = function (a, b) return bin(a, "=", b) end plus = function (a, b) return bin(a, "+", b) end minus = function (a, b) return bin(a, "-", b) end mul = function (a, b) return bin(a, "mul", b) end Mul = function (a, b) return bin(a, "*", b) end div = function (a, b) return bin(a, "/", b) end Div = function (a, b) return bin(a, "//", b) end pow = function (a, b) return bin(a, "^", b) end E[ "x" ] = var"x" E[ "ln x" ] = ap(fun"ln", E"x") E["(ln x)" ] = paren(E"ln x") E[ "3" ] = num("3") E["(ln x)^3" ] = pow(E"(ln x)", E"3") E["(ln x)^3" ] = pow(E"(ln x)", E"3") E[ "5" ] = num("5") E[ "sin x"] = ap(fun"sin", E"x") E[ "5 + sin x"] = plus(E"5", E"sin x") E["(ln x)^3 // 5 + sin x"] = Div(E"(ln x)^3", E"5 + sin x") E[ "f" ] = fun"f" E[ "(x)" ] = paren(E"x") E[ "f(x)" ] = ap(E"f", E"(x)") E[ "g" ] = fun"g" E[ "g(x)" ] = ap(E"g", E"(x)") E[ "f(x)g(x)" ] = mul(E"f(x)", E"g(x)") E["(f(x)g(x))" ] = paren(E"f(x)g(x)") E["(f(x)g(x))'" ] = plic(E"(f(x)g(x))") E[ "f'" ] = fun"f'" E[ "f'(x)" ] = ap(E"f'", E"(x)") E[ "f'(x)g(x)" ] = mul(E"f'(x)", E"g(x)") E[ "g'" ] = fun"g'" E[ "g'(x)"] = ap(E"g'", E"(x)") E[ "f(x)g'(x)"] = mul(E"f(x)", E"g'(x)") E[ "f'(x)g(x) + f(x)g'(x)"] = plus(E"f'(x)g(x)", E"f(x)g'(x)") E["(f(x)g(x))' = f'(x)g(x) + f(x)g'(x)"] = eq(E"(f(x)g(x))'", E"f'(x)g(x) + f(x)g'(x)") --[[ * (eepitch-lua51) * (eepitch-kill) * (eepitch-lua51) dofile "Ast4.lua" = E["(f(x)g(x))' = f'(x)g(x) + f(x)g'(x)"] = E["(ln x)^3 // 5 + sin x"] --]] foldplic = function (A) local o = A[1] for i=2,#A do o = plic(o) end return o end gr,V,VA,VE,PE = Gram.new() grcm = function (...) print(gr:cm(...)) end _ = S(" ")^0 VA.num = Cs(R"09"^1) VA.var = anyof "x" VA.fun = anyof "f' f g' g ln sin" VA.ap = V.fun *_* V.exprbasic VA.paren = "("*_* V.expr *_*")" V.exprbasic = V.paren + V.ap + V.num + V.fun + V.var V.exprplic = assocpost(V.exprbasic, Cs"'" ) V.exprpow = assocr(V.exprplic, Cs"^" ) V.exprmul = assocl(V.exprpow, Cc"mul" ) V.exprMul = assocl(V.exprmul, Cs"*" ) V.exprplus = assocl(V.exprMul, Cs"+" ) V.exprDiv = assocl(V.exprplus, Cs"//" ) V.expreq = assocl(V.exprDiv, Cs"=" ) V.expr = V.expreq V.exprplic = Ct(V.exprbasic * (_*Cs"'")^0) / foldplic --[[ * (eepitch-lua51) * (eepitch-kill) * (eepitch-lua51) dofile "Ast4.lua" = grcm("num", "234") = grcm("expr", "234") = grcm("expr", "f'") = grcm("expr", "f'(x)") = grcm("expr", "f'(x)") = grcm("expr", "f'(x) + 5") = grcm("expr", "f'(x) + 5^6 // 20") = grcm("expr", "(ln x)^3 // 5 + sin x") = grcm("expr", "(f(x)g(x))' = f'(x)g(x) + f(x)g'(x)") = E["(f(x)g(x))' = f'(x)g(x) + f(x)g'(x)"] = E["(ln x)^3 // 5 + sin x"] --]] totex00 = ToText0 { fmts = { ["()"] = "(<1>)", ["//"] = "\\frac{<1>}{<2>}", ["^"] = "{<1>}^{<2>}", ["+"] = "<1> + <2>", ["="] = "<1> = <2>", ap = "<1> <2>", mul = "<1> <2>", Mul = "<1> \\cdot <2>", ["'"] = "<1>'", -- num = "<1>", var = "<1>", fun = "<tt0.funs[o[1]] or o[1]>", }, funs = { ln = "\\ln ", sin = "\\sin ", }, } --[[ * (eepitch-lua51) * (eepitch-kill) * (eepitch-lua51) dofile "Ast4.lua" = gr:cm ("expr", "(ln x)^3 // 5 + sin x") o = gr:cm0("expr", "(ln x)^3 // 5 + sin x") = o = totex(o) = o:show("4 dd") = Show.log * (etv) -- (find-angg "LUA/Show1.lua" "string.show-tests") --]] -- Local Variables: -- coding: utf-8-unix -- End: