мне нужно разобрать функцию строки, представляющие, как это:Пролог - разбор функции с DCG
<fsignature>"(" <term1>, <term2> ... <termn>")"
Функция»подпись и условие также должно контролироваться в дальнейшем для функции будет принята. Я написал этот DCG в Prolog:
fsign --> {is_leg(A)}, [A].
terms --> (funct, funct; terms).
terms --> (terms, terms; term).
term --> {is_term(T)}, [T].
Но это, кажется, не работает, когда я пытаюсь использовать фразу (функц [Foo, "(", а, а, ")"]). он переходит в переполнение. is_leg просто проверяет, является ли строка законной (строка начинается с символа), а is_term должен проверить, является ли этот термин литералом (константа, переменная или функция).
Что это не работает? Я полагаю, вероятно, переменные - должен ли я ставить их как аргументы нетерминалов?
Спасибо за любую помощь.
Что-то вроде «термины -> (термины, термины; термин).» - это то же самое, что: «термины -> термины, термины.» И «термины -> термин». Первое, очевидно, быть бесконечной рекурсией. Непонятно, что вы хотите, чтобы это правило говорило. – lurker
Функции могут иметь arity n, поэтому у него может быть бесконечное количество аргументов, поэтому я ввел это правило. Язык должен быть бесконечным, но он должен сказать мне, какие строки приняты, а какие нет, не так ли? – Dodicin
Вы не имеете в виду, что у вас будет бесконечное количество аргументов, не так ли? Вы действительно имеете в виду, что оно может иметь * любое * количество аргументов, но любой заданный член имеет конечное число. Там просто нет предела тому, сколько. В какой-то момент синтаксический разбор должен заканчиваться, то есть входная последовательность имеет конечное число элементов. – lurker