prolog 中的字符串标记化

发布于 2024-12-17 04:20:56 字数 247 浏览 2 评论 0原文

我在文本文件“grammar.txt”中有以下上下文无关语法,

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

我打开该文件并能够读取序言中的每一行。 现在我想标记每一行并生成一个列表,例如

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

我怎样才能做到这一点?

I have the following context free grammar in a text file 'grammar.txt'

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

I'm opening this file and able to read each line in prolog.
Now i want to tokenize each line and generate a list such as

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

How can i do this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

淡淡的优雅 2024-12-24 04:20:56

将规范写入 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

Write the specification in a DCG. I give you the basic (untested), you'll need to refine it.

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 --> [].

This parse the whole file, using this toplevel:

  ...,
  read_file_to_codes('grammar.txt', Codes),
  phrase(parse_grammar(Grammar), Codes, [])).

You say you read the file 1 line at time: then use

  ...
  findall(R, (get_line(L), phrase(parse_rule(R), L, [])), Grammar).

HTH

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文