Lua模式可以代表任何常规语言吗?

时间:2016-06-05 02:25:33

标签: lua regular-language formal-languages

这个问题不会问Lua模式是否是PCRE。这已被多次询问,答案绝对没有。

相反,我问的是,Lua模式是否与正式语言定义类似于常规语言。我的直觉不是因为我无法为这种常规语言创建模式:

L = {'foo'}* = {'', 'foo', 'foofoo', 'foofoofoo', ...}

我所有的尝试都失败了,因为Lua似乎缺乏在捕获时使用Kleene Star的能力:

> print(('foofoo'):find('(foo)*'))
nil

你能否证明Lua中没有可以表示L的模式,更一般地说,是否可以为任何常规语言创建Lua模式?

2 个答案:

答案 0 :(得分:1)

Lua模式不是常规语言。几乎每个Lua模式都可以表示为常规语言,但是有很多正则表达式不能表示为Lua模式(并且至少有一个Lua模式不是常规的)。并且Lua模式无法实现您尝试执行的特定常规构造,匹配特定字符序列的重复。不是一般情况。

基本上,Lua模式不能做任何需要基于输入流中多个字符的决策点的事情。常规语言可以。

答案 1 :(得分:-1)

Kleene Star可轻松实施:

function belongs_to_L(str)
   return str:gsub("foo", "") == ""
end

print(belongs_to_L("foofoo"))  --> true
print(belongs_to_L("bar"))     --> false