2013-04-24 87 views
0

DCG分析器序言中給定下面的語法邏輯語句

BoolExpr ::= BoolConj { "or" BoolConj }. 
BoolConj ::= BoolLit { "and" BoolLit }. 
BoolLit ::= [ "not" ] BoolPosLit. 
BoolPosLit ::= "true"| "false"| "(" BoolExpr ")". 

我想寫一個解析器DCG上面的語法。解析器簡單地只需要接受(成功)或拒絕(失敗)在給定的輸入,

以下是我有:

boolepxr([or(O)|BoolExpr]) --> 
    ['or'], 
    boolconj(O), 
    boolexpr(BoolExpr). 

boolconj([and(A)|BoolConj]) --> 
    ['and'], 
    boollit(A), 
    boolconj(BoolConj). 

boollit([not(N)|BoolLit]) --> 
    ['not'], 
    boolps(N). 

boolps([true(B)|BoolPs]) --> 
    ['true'], 
    boolexpr(B), 
    boolps(BoolPS). 

boolps([false(B)|BoolPs]) --> 
    ['false'], 
    boolexpr(B), 
    boolps(BoolPS). 

然而,當我運行這個程序,我沒有得到適當的輸出。

+0

你是怎麼與運行呢?你期望什麼產出? – 2013-04-24 04:01:01

回答

2

因爲DCG必須識別輸入,我已經簡化:

boolexpr --> boolconj, [or], boolexpr. 
boolexpr --> boolconj. 

boolconj --> boollit, [and], boolconj. 
boolconj --> boollit. 

boollit --> [not], boolps. 
boollit --> boolps. 

boolps --> [true]. 
boolps --> [false]. 
boolps --> ['('], boolexpr, [')']. 

產量

?- phrase(boolexpr, [true,or,false,and,not,true]). 
true ; 
false.