2012-05-03 69 views
0

我正在尝试为一个语法编写一个简单的解析器。解析器不需要创建分析树,只需要识别句子是否与语法相匹配。到目前为止,我有以下的谓词,采用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-->[/]. 

使用的查询,如程序([阅读,ID],[])。我应该得到一个真正的回应,但我得到一个错误的回应。缺少什么导致了这一点?感谢您的帮助。

+0

您可以使用trace/0来查找错误 – whd

回答

0

stmt_list也可以是空的。加入stmt_list --> []解决了这个问题。

+0

我无法弄清楚如何让程序读入包含要解析的标记的文件。另外,我认为沿着解析(输入):=程序(输入,[])的规则是一条规则。会像运行程序查询一样工作,但它会给出未定义的过程错误。任何想法为什么? – jldavis76

+0

您需要添加围绕您的DCG的Prolog代码。可以用'open/4'或'see/1'来打开文件进行阅读 –