#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).