Prolog DCG从字母数字字符构建/识别单词串

问题描述 投票:1回答:1

因此,我正在使用Definite Clause Grammars在SWI-Prolog中为一些编程语言编写简单的解析器。如果输入字符串或文件对相关语言有效,则返回true;如果输入字符串或文件无效,则返回false。

在所有几乎所有语言中都有一个“标识符”谓词。在大多数语言中,标识符被定义为EBNF中的以下内容之一:letter { letter | digit }( letter | digit ) { letter | digit },也就是说在第一种情况下是一个字母后跟零个或多个字母数字字符,或者我

我的输入文件被分成一个单词串列表(即someIdentifier1 = 3成为列表[someIdentifier1,=,3])。将字符串拆分为单词列表而不是字母列表的原因是用于识别定义为终端的关键字。

如何实现“标识符”,以便识别任何字母数字字符串或由字母后跟字母数字字符组成的字符串。

是否有可能或有必要将该单词进一步拆分为该特定谓词的字母,如果是这样,我将如何进行此操作?或者是否有另一种解决方案,也许使用SWI-Prolog库的内置谓词?

我为这个问题的措辞不好而道歉;但是,我无法进一步澄清。

string prolog swi-prolog dcg
1个回答
2
投票

首先,当您需要推理单个字母时,通常最方便的是推断字符列表。

在Prolog中,您可以使用atom_chars/2轻松地将原子转换为字符。

例如:

?- atom_chars(identifier10, Cs).
Cs = [i, d, e, n, t, i, f, i, e, r, '1', '0'].

一旦你有这样的字符,你可以使用像char_type/2这样的谓词来推断每个字符的属性。

例如:

?- char_type(i, T).
T = alnum ;
T = alpha ;
T = csym ;
etc.

用DCG表示诸如你的标识符的一般模式可以如下所示:

identifier -->
        [L],
        { letter(L) },
        identifier_rest.

identifier_rest --> [].
identifier_rest -->
        [I],
        { letter_or_digit(I) },
        identifier_rest.

您可以将其用作构建块,只需要定义letter/1letter_or_digit/1。使用char_type/2非常容易。

此外,您当然可以引入一个参数来将这些列表与原子相关联。

© www.soinside.com 2019 - 2024. All rights reserved.