lua-users home
lua-l archive

Re: lpeg.Cg, lpeg.Cb, and how to visualize what they do

[Date Prev][Date Next][Thread Prev][Thread Next] [Date Index] [Thread Index]


It was thus said that the Great Eduardo Ochs once stated:
> On 2023年8月16日 at 12:20, Sean Conner <sean@conman.org> wrote:
> > (...)
> 
> Hi Sean,
> 
> > I don't see these as different, due to the fact that
> >
> > (a * b) * c = a * (b * c)
> 
> try this:
> 
> foo = function (str) return setmetatable({str}, foo_mt) end
> foo_mt = {
> __tostring = function (a) return a[1] end,
> __mul = function (a,b) return foo(format("(%s%s)", a[1], b[1])) end,
> }
> = (foo"a" * foo"b") * foo"c" --> "((ab)c)"
> = foo"a" * (foo"b" * foo"c") --> "(a(bc))"
> 
> The associativity of the multiplication in Lua is not a "fact".
 Couter example:
	local lpeg = require "lpeg"
	local function HEREt(tag)
	 return lpeg.Cmt(lpeg.P"",function(subject,pos) 
	 io.stderr:write(string.format("%s: %s\n",tag,subject:sub(pos,pos+40))) 
	 return pos
	 end)
	end
	
	local a = HEREt"a" * lpeg.C"a"
	local b = HEREt"b" * lpeg.C"b"
	local c = HEREt"c" * lpeg.C"c"
	local p1 = (a * b) * c
	local p2 = a * (b * c)
	print("p1",p1:match"abc")
	print("p2",p2:match"abc")
 The two expressions parse the same way, with the same results (and yes,
you can remove the HEREt() calls to avoid Cmt() and still get the same
result).
> > These are expressions ... what's a "subpattern"? Again,
> >
> > (a * b) * c = a * (b * c)
> 
> Is that a honest question?
 Yes, it was. Thank you for the explanation.
 -spc

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