Добрый день! Я пытаюсь создать программу, которая принимает лямбда-выражение от пользователя, и что эта программа делает, чтобы проверить, является ли оно действительным лямбда-выражением.
пример — пользовательский ввод (λa.abc) a -> затем проверяет
Моя проблема в том, что мои знания о функциях Regex очень ограничены, я использовал preg_match, чтобы решить эту проблему, но все еще не достиг большого прогресса. любая помощь будет высоко ценится .. Спасибо 🙂
Ну, это правила действительного λ-выражения
- одна переменная = (одна буква)
- применение функции = (λ-выражение) (λ-выражение)
- функция абстракция = λ (переменная). (λ-выражение)
Это код, который я сделал с preg_match
if(preg_match("/\((L([a-z])*.(([a-z])*)*)\)/", $getexpression, $match)):
print "Valid!";
не очень хорошо работает
Я должен признаться, что я не получил слишком много от вашего определения выражений, так как вы в основном сказали, что «выражение — это переменная или набор переменных».
Я бы вообще рекомендовал избегать использования слова, которое вы пытаетесь определить в самом определении.
Тем не менее, прочитав Википедию и комментарии, я думаю, я мог бы получить то, что можно истолковать как рабочее регулярное выражение для этого:
// 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%, что это можно проверить с помощью регулярного выражения. По крайней мере, не полностью. Это похоже на то, что вам нужно написать / использовать токенизатор за.
Других решений пока нет …