美好的一天!我正在尝试创建一个程序,接受用户的Lambda表达式,该程序的作用是检查它是否是有效的Lambda表达式。
示例 - 用户输入(λa.abc)a - >然后验证
我的问题是我对正则表达式函数的了解非常有限,我一直在使用preg_match来解决这个问题,但仍然没有太大的进展。任何帮助将不胜感激..谢谢:)
这些是有效的λ表达式的规则
- 单个变量=(单个字母)
- function application =(λ-expression)(λ-expression)
- function abstraction =λ(variable)。(λ-expression)
醇>
这是我用preg_match
做的代码if(preg_match("/\((L([a-z])*.(([a-z])*)*)\)/", $getexpression, $match)):
print "Valid!";
效果不好
答案 0 :(得分:1)
我必须承认我没有从你对表达式的定义中得到太多,因为你基本上说“表达式是一个变量,或一组变量”。
我一般建议避免使用你试图在定义中定义的单词。
那就是说,通过阅读维基百科和评论,我想我可能已经得到了可以被解释为一个有效的正则表达式:
// Basic definition: Lambda + letter == variable.
$lVar = 'λ[a-z]';
// Complex definition: Variable, possibly followed by variables,
// and closed with a letter preceeded by a dot or whitespace.
$lExp = "({$lVar}(?:\\.{$lVar})*(?:[ .][a-z]+))";
// Complete definition:
// 1. Only single expression.
// 2. Or a parameterized expression which may contain
// the entire pattern recursively.
$lRegEx = "/^$lExp|\\($lExp(?R)\\)\\Z/u";
话虽如此,我并非100%确定这可以用正则表达式进行测试。至少不完全。这似乎是你需要编写/使用tokenizer for。
的东西