Парсинг чисел с множеством чисел в прологе
У меня есть следующий простой парсер выражений:
expr(+(T,E))-->term(T),"+",expr(E).
expr(T)-->term(T).
term(*(F,T))-->factor(F),"*",term(T).
term(F)-->factor(F).
factor(N)-->nat(N).
factor(E)-->"(",expr(E),")".
nat(0)-->"0".
nat(1)-->"1".
nat(2)-->"2".
nat(3)-->"3".
nat(4)-->"4".
nat(5)-->"5".
nat(6)-->"6".
nat(7)-->"7".
nat(8)-->"8".
nat(9)-->"9".
однако это поддерживает только 1-значные числа. Как я могу разобрать числа с несколькими цифрами в этом случае?
3 ответов
используйте переменные аккумулятора и передайте их в рекурсивных вызовах. В следующем, A и A1 являются аккумулятором.
digit(0) --> "0".
digit(1) --> "1".
% ...
digit(9) --> "9".
nat(N) --> digit(D), nat(D,N).
nat(N,N) --> [].
nat(A,N) --> digit(D), { A1 is A*10 + D }, nat(A1,N).
обратите внимание, что первый nat
предложение инициализирует аккумулятор, потребляя цифру, потому что вы не хотите соответствовать пустой строке.
nat(0).
nat(N):-nat(N-1).
но вы используете синтаксис, который я не знаю (см. Мой комментарий выше).
можете вы обеспечить входной сигнал образца?
Я думаю, что это может работы:
nat(N)-->number(N).
Если это не удается попробовать:
nat(N)-->number(N),!.
The ! разрез останавливает объединение. Вы можете прочитать об этом в книгах/учебниках.