Prolog - Parsing

后端 未结 1 1243
醉话见心
醉话见心 2021-01-05 16:57

I\'m new to the language prolog and have been given an assignment regarding parsing in prolog. I need some help in solving the problem.

In the assingment we have the

相关标签:
1条回答
  • 2021-01-05 17:18

    Prolog has a particular formalism to handle context-free grammars directly: DCGs (Definite Clause Grammars). Your example translates almost immediately into a DCG:

    expr --> [+], expr, expr | [*], expr, expr | num | xer.
    
    xer --> [x] | [^], [x], num.
    
    num --> [2] | [3] | [4] | [5].
    

    Now, you already can test sentences:

    ?- phrase(expr, [+, *, 2, x, ^, x, 5 ]).
    true ;
    false.
    
    ?- phrase(expr, [+, *, *, 2, x, ^, x, 5 ]).
    false.
    

    You can even generate all possible sentences like so:

    ?- length(L, N), phrase(expr, L).
    L = [2],
    N = 1 ;
    L = [3],
    N = 1 ;
    ...
    

    And, finally, you can add the abstract syntax tree to your definition.

    expr(plus(A,B)) --> [+], expr(A), expr(B).
    expr(mul(A,B)) --> [*], expr(A), expr(B).
    expr(Num) --> num(Num).
    expr(Xer) --> xer(Xer).
    
    xer(var(x)) --> [x].
    xer(pow(var(x),N)) --> [^], [x], num(N).
    
    num(num(2)) --> [2].
    num(num(3)) --> [3].
    num(num(4)) --> [4].
    num(num(5)) --> [5].
    

    So now you can use it as desired:

    ?- phrase(expr(AST), [+, *, 2, x, ^, x, 5 ]), phrase(expr(AST),L).
    AST = plus(mul(num(2), var(x)), pow(var(x), num(5))),
    L = [+, *, 2, x, ^, x, 5] ;
    false.
    

    Just a nitpick: The interface predicate to DCGs is phrase/2 not parse/2.

    0 讨论(0)
提交回复
热议问题