我是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').
答案 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