Струнный токенизация в прологе - PullRequest
1 голос
/ 22 ноября 2011

У меня есть следующая контекстно-бесплатная грамматика в текстовом файле 'grammar.txt'

S ::= a S b
S ::= []

Я открываю этот файл и могу прочитать каждую строку в прологе. Теперь я хочу токенизировать каждую строку и создать список, такой как

L=[['S','::=','a','S','b'],['S','::=','#']]  ('#' represents empty)

Как я могу это сделать?

1 Ответ

2 голосов
/ 22 ноября 2011

Написать спецификацию в 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

...