Пролог — Синтаксический анализатор Не работает при использовании унарного минуса

#parsing #prolog #grammar #abstract-syntax-tree

Вопрос:

Я создаю арифметический анализатор для примера грамматики в прологе, который принимает список токенов и возвращает AST для ввода is/2 , но я зашел в тупик при реализации унарного минуса. Насколько я могу судить, все остальные части работают в следующем коде, кроме унарного минуса.

 expr(Expr) --> term(Term), exprLoop(Term, Expr).

exprLoop(Term, ExprLoop) --> [ ], term(Term2), exprLoop(Term   Term2, ExprLoop).
exprLoop(Term, ExprLoop) --> [-], term(Term2), exprLoop(Term - Term2, ExprLoop).
exprLoop(ExprLoop, ExprLoop) --> [].

term(Term) --> factor(Factor), termLoop(Factor, Term).

termLoop(Factor, TermLoop) --> [*], factor(Factor2), termLoop(Factor * Factor2, TermLoop).
termLoop(Factor, TermLoop) --> [/], factor(Factor2), termLoop(Factor / Factor2, TermLoop).
termLoop(TermLoop, TermLoop) --> [].

factor(Factor) --> [-], factor(-Factor).
factor(Factor) --> ['('], expr(Factor), [')'].
factor(Factor) --> [ Factor ], { integer(Factor) }.

parse(Tokens, Ast) :-
  phrase(expr(Ast), Tokens, []).
 

При анализе выражения без унарного минуса оно функционирует нормально, но возвращает значение false, если оператор имеет унарный минус. Удаление - из -Factor в factor(Factor) --> [-], factor(-Factor). , parse успешно, но, очевидно, дает неправильный результат. Я в основном смущен тем, почему - in -Factor приводит к сбою синтаксического анализатора, в то время как аналогичная арифметика по аргументам exprLoop и termLoop функционирует нормально.

Комментарии:

1. Попробуйте использовать factor(-Factor) --> [-], factor(Factor). вместо factor(Factor) --> [-], factor(-Factor). этого .

2. О, это было просто. Я не думал использовать сопоставление шаблонов в аргументах --> правил, но мне следовало подумать о том, что это всего лишь макросы. Спасибо вам за решение!

Ответ №1:

Согласно слаго:

Попробуйте использовать factor(-Factor) --> [-], factor(Factor). , вместо factor(Factor) --> [-], factor(-Factor).