2012-05-03 9 views
0

私は文法のための簡単なパーサーを書こうとしています。パーサは構文解析ツリーを作成する必要はなく、文が文法と一致するかどうかのみを認識します。これまでのところ、私は、DCG表記を使用して、以下の述語を有する:Prologパーサーを書く

プログラム等のクエリを使用して
program-->[]. 
    program-->stmt_list. 
    stmt_list-->stmt,stmt_list. 
    stmt-->[id,:=],expr;[read],[id];[write],expr. 
    expr-->term, term_tail. 
    term_tail-->add_op,term,term_tail. 
    term_tail-->[]. 
    term-->factor, factor_tail. 
    factor_tail-->mult_op, factor, factor_tail. 
    factor_tail-->[]. 
    factor-->[(expr)]. 
    factor-->[id]. 
    factor-->[number]. 
    add_op-->[+]. 
    add_op-->[-]. 
    mult_op-->[*]. 
    mult_op-->[/]. 

([]、[、IDを読み取ります])。私は本当の反応を得ているはずですが、私は偽のものを得ています。これが原因で何が欠けていますか?ご協力ありがとうございました。

+0

uはトレースを使用してエラーを調べることができます – whd

答えて

0

stmt_listも空にすることができます。 stmt_list --> []を追加することで問題は解決します。

+0

解析するトークンを含むファイルをプログラムに読み込ませる方法がわかりません。また、パース(入力)の行に沿ってルールを考えました:= program(Input、[])。プログラムクエリの実行と同じように動作しますが、定義されていないプロシージャエラーが発生します。どんな考え? – jldavis76

+0

DCGを取り囲むPrologコードを追加する必要があります。読み込み用のファイルは 'open/4'または' see/1'で行うことができます –

関連する問題