将列表元素读取到另一个列表,直到遇到特殊字符

时间:2011-11-27 23:55:56

标签: prolog

我正在阅读一个包含上下文无关语法的文件,并对每一行进行标记并生成表单列表

L = ['S', =, a, 'S', b, ;, 'S', =, c;].

在列表';'中意味着换行。该列表可以基于文件中的语法来扩展。 现在我想为每个';'分区列表遇到。

例如,请考虑以下规则

getRule(List, First, Rest):-

我应该能够获得第一个语法行'S',=,a,'S',b 第一个,其余列表为每次递归<休息

1 个答案:

答案 0 :(得分:1)

以下是整个事情(如何将列表拆分为规则):

getRules([], _Delimiter, []) :- !.
getRules(List, Delimiter, [Rule|Rules]) :-
    getRule(List, Delimiter, Rule, Rest),
    getRules(Rest, Delimiter, Rules).

使用你要求的getRule:

getRule([], _Delimiter, [], []) :- !.
getRule([Delimiter|Rest], Delimiter, [], Rest) :- !.
getRule([Item|List], Delimiter, [Item|Rule], Rest) :-
    getRule(List, Delimiter, Rule, Rest).

可用

调用
?- getRule(['S', =, a, 'S', b, ;, 'S', =, c, ;], ;, Rule, Rest).

返回

Rule = ['S', =, a, 'S', b],
Rest = ['S', =, c, ;].

主要的一个:

?- getRules(['S', =, a, 'S', b, ;, 'S', =, c, ;], ;, Rules).

返回

Rules = [['S', =, a, 'S', b], ['S', =, c]].

你显然可以硬编码;如果你想! 请询问您是否需要有关代码的任何说明 我添加了评论中讨论的修改,并在您阅读后删除了剧透。

这是你要求的另一件事:

divideRules(Rules, PureRules) :-
    divideRules_(Rules, Temp),
    append(Temp, PureRules).
divideRules_([], []) :- !.
divideRules_([Rule|Rules], [PureRule|PureRules]) :-
    divideRule(Rule, PureRule),
    divideRules_(Rules, PureRules).
divideRule(Rule, PureRule) :-
    getRule(Rule, ::=, Left, Right),
    append([Left, [::=]], NewLeft),
    getRules(Right, '|', PureRight),
    maplist(append(NewLeft), PureRight, PureRule).

这是我的猜测,但我现在不能运行prolog解释器,所以它没有经过测试:

grammarize([], []) :- !.
grammarize([[Left, ::=|Right]|PureRules], [grammar(Left, Right)|Grammars]) :-
    grammarize(PureRules, Grammars).