More concise number parsing

This commit is contained in:
Hugo Sales 2018-12-10 17:33:35 +00:00
parent 040f3bd859
commit ea80d57ef9

View File

@ -236,12 +236,15 @@ parse_number(TL, T, [WN | R], NC) :-
parse_number(op(*, TL, N), T, R, NC), parse_number(op(*, TL, N), T, R, NC),
!. !.
parse_number(TL, T, [and, WN | R], NC) :- parse_number(TL, T, [and, WN | R], NC) :-
special_word_number(WN, _, _),
parse_number(TL, T, [WN | R], NC), parse_number(TL, T, [WN | R], NC),
!. !.
parse_number(T, T, [WN | R], [WN | R]) :- parse_number(T, T, [WN | R], [WN | R]) :-
not(word_tree(WN, _)), T \= void,
not(special_word_number(WN, _, _)),
!. !.
parse_number(T, T, [], []) :- parse_number(T, T, [], []) :-
T \= void,
!. !.
%% Tests: %% Tests:
%% ?- parse_number(void, T, [two], _). %% ?- parse_number(void, T, [two], _).
@ -262,14 +265,47 @@ parse_number(T, T, [], []) :-
%@ T = op(+, op(*, 2, 100), 1). %@ T = op(+, op(*, 2, 100), 1).
%% ?- parse_number(void, T, [twenty, one, hundred, and, twenty, one], _). %% ?- parse_number(void, T, [twenty, one, hundred, and, twenty, one], _).
%@ T = op(+, op(+, op(*, op(+, 20, 1), 100), 20), 1). %@ T = op(+, op(+, op(*, op(+, 20, 1), 100), 20), 1).
%% ?- parse_number(void, T, [twenty, one, hundred, and, twenty, one, foo, bar, blah], _). %% ?- parse_number(void, T, [twenty, one, hundred, and, twenty, one, foo, bar, blah], NC).
%@ T = op(+, op(+, op(*, op(+, 20, 1), 100), 20), 1). %@ T = op(+, op(+, op(*, op(+, 20, 1), 100), 20), 1),
%% ?- parse_number(void, T, [twenty, one, hundred, and, bleg, twenty, quux, one, foo, bar], _). %@ NC = [foo, bar, blah].
%@ T = op(*, op(+, 20, 1), 100). %% ?- parse_number(void, T, [twenty, one, hundred, and, bleg, twenty, quux, one, foo, bar], NC).
%@ T = op(*, op(+, 20, 1), 100),
%@ NC = [and, bleg, twenty, quux, one, foo, bar].
%% ?- parse_number(void, T, [two, hundred, thousand], _). %% ?- parse_number(void, T, [two, hundred, thousand], _).
%@ T = op(*, op(*, 2, 100), 1000). %@ T = op(*, op(*, 2, 100), 1000).
%% ?- parse_number(void, T, [twenty, one, hundred, thousand], _).
%@ T = op(*, op(*, op(+, 20, 1), 100), 1000).
%% ?- parse_number(void, T, [thirty, five, million], _).
%@ T = op(*, op(+, 30, 5), 1000000).
%% ?- parse_number(void, T, [foo, five, million], NC).
%@ false.
operations(times, *).
operations(plus, +).
parse_operation(Op) --> [WOp], { operations(WOp, Op) }.
parse_expression(TLP-TL, op(Op, TLP-TL, TR)) --> parse_number(void, TL),
parse_operation(Op),
parse_expression(op(Op, TL, TRP)-TRP, TR).
parse_expression(void, T) --> parse_number(void, T), { T \= void }.
parse_expression(TL, TL-TR) --> parse_number(void, TR), { TR \= void, TL \= void }.
%% Tests:
%% ?- parse_expression(T, [], _).
%@ false.
%% ?- parse_expression(T, [two], _).
%@ T = 2.
%% ?- parse_expression(void, T, [two, times, two], _).
%@ T = 2 ;
%@ false.
%@ T = 2 ;
%@ false.
%@ T = op(*, 2, 2).
%% ?- parse_expression(T, [two, times, three, plus, two], _).
%@ T = op(*, 2, 3).
%@ T = op(*, 2, op(+, 3, 2)).
%% ?- parse_expression(T, [two, times, times, two], _).
%@ false.