テキストファイル「grammar.txt」に次の文脈自由文法があります
S ::= a S b
S ::= []
このファイルを開いて、プロローグの各行を読み取ることができます。今、私は各行をトークン化し、次のようなリストを生成したい
L=[['S','::=','a','S','b'],['S','::=','#']] ('#' represents empty)
これどうやってするの?
仕様を DCG に記述します。基本的な (テストされていない) ものを提供しますが、それを改良する必要があります。
parse_grammar([Rule|Rules]) -->
parse_rule(Rule),
parse_grammar(Rules).
parse_grammar([]) --> [].
parse_rule([NT, '::=' | Body]) -->
parse_symbol(NT),
skip_space,
"::=",
skip_space,
parse_symbols(Body),
skip_space, !. % the cut is required if you use findall/3 (see below)
parse_symbols([S|Rest]) -->
parse_symbol(S),
skip_space,
parse_symbols(Rest).
parse_symbols([]) --> [].
parse_symbol(S) -->
[C], {code_type(C, alpha), atom_codes(S, [C])}.
skip_space -->
[C], {code_type(C, space)}, skip_space.
skip_space --> [].
これは、このトップレベルを使用してファイル全体を解析します。
...,
read_file_to_codes('grammar.txt', Codes),
phrase(parse_grammar(Grammar), Codes, [])).
ファイルを一度に1行ずつ読んだと言います:次に使用します
...
findall(R, (get_line(L), phrase(parse_rule(R), L, [])), Grammar).
HTH