从文件中读取并使用Prolog DCG规则显示内容

时间:2015-03-24 05:27:09

标签: prolog dcg

我是prolog中的新手,我想阅读一个实际包含CLASS定义的文件 - 使用Prolog DCG Rule。但我现在卡在中间..

我的输入文字(linessample.txt)

class component {
        attributes
          Real V, I, R;
        constraints
          V = I * R;
        constructors component(V1, I1, R1) {
          V = V1; I = I1; R = R1;
        }
} 

我想在prolog中使用DCG规则阅读上面的示例文本...我已经编写了一个示例代码..但我没有得到第一个单词" class"在输出中

代码

    :- use_module(library(pio)).
    %classrule(Z) -->class,letter(X),letters(L),{name(Z,[X|L])}.
    classrule(Z) -->"class ",classname(X),"{",{name(Z,X)}.
    classname([X|L])-->letter(X),letters(L).
    letters([X|L])-->letter(X),!,letters(L).
    class-->"class".
    letters([])-->[].
    letter(X)-->[X], {alpha(X)}.
    alpha(X) :- X > 64, X < 91.
    alpha(X) :- X > 96, X < 123.

如何运行

    phrase_from_file(classrule(Z),'linesample.txt').  

1 个答案:

答案 0 :(得分:3)

您的计划有两个主要问题:   1.您不允许在classname / 1和“{”之间出现空格。由于在实践中可能会出现多个空格(和水平制表符),因此我使用了库whites//0中的dcg/basics。   2. phrase_from_file/2尝试解析整个输入文档,而你的语法只覆盖第一行(即类名)。这是通过跳过文件的其余部分来解决的。我使用'...'//0然后使用eos//0

然后有一些小事:   1. letters//1的子句不会连续放在代码文件中。我已经重新定位了一个子句,但您也可以在程序的顶部添加声明:- discontiguous(letters//1).。   2.我使用code_type/2检查字母字符。

结果代码,在mat:

的有用评论后更新
:- use_module(library(dcg/basics)).
:- use_module(library(pio)).

classrule(Z) -->
  "class",
  whites,
  classname(X),
  whites,
  "{",
  {name(Z,X)},
  ... .

classname([H|T])-->
  letter(H),
  letters(T).

letters([H|T])-->
  letter(H), !,
  letters(T).
letters([])--> [].

letter(X)-->
  [X],
  {code_type(X, alpha)}.

... --> [].
... -->
  [_],
  ... .

使用示例:

?- phrase_from_file(classrule(X), 'linesample.txt').
X = component