Parsing 编写Prolog解析器

Parsing 编写Prolog解析器,parsing,prolog,dcg,Parsing,Prolog,Dcg,我正在尝试为语法编写一个简单的解析器。解析器不需要创建解析树,只需要识别句子是否与语法匹配。到目前为止,我有以下使用DCG表示法的谓词: program-->[]. program-->stmt_list. stmt_list-->stmt,stmt_list. stmt-->[id,:=],expr;[read],[id];[write],expr. expr-->term, term_tail. term_tail

我正在尝试为语法编写一个简单的解析器。解析器不需要创建解析树,只需要识别句子是否与语法匹配。到目前为止,我有以下使用DCG表示法的谓词:

    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-->[/].

使用诸如program([read,id],])之类的查询。我应该得到一个真实的回答,但我得到了一个错误的回答。造成这种情况的原因是什么?谢谢您的帮助。

stmt\u列表也可以为空。添加
stmt\u列表-->[]
解决了这个问题。

stmt\u列表也可以为空。添加
stmt\u列表-->[]
解决了这个问题。

u可以使用trace/0查找错误su可以使用trace/0查找错误我很难弄清楚如何让程序读取包含要解析的标记的文件。此外,我还考虑了一条与parse(Input)类似的规则:=program(Input,[])。其工作原理与仅运行程序查询相同,但它会给出一个未定义的过程错误。知道为什么吗?您需要在DCG周围添加Prolog代码。打开文件进行读取可以使用
open/4
see/1
来完成。我不知道如何让程序读取包含要解析的标记的文件。此外,我还考虑了一条与parse(Input)类似的规则:=program(Input,[])。其工作原理与仅运行程序查询相同,但它会给出一个未定义的过程错误。知道为什么吗?您需要在DCG周围添加Prolog代码。可以使用
open/4
see/1