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



所以我正在使用定子句语法为SWI-Prolog中的某些编程语言编写简单的解析器。目标是如果输入字符串或文件对相关语言有效,则返回 true,如果输入字符串或文件无效,则返回 false。

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

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

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

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

对于这个问题的措辞不佳,我深表歉意;但是,我无法进一步澄清。

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

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

例如:

?- atom_chars(标识符10,Cs)。Cs = [i, d, e, n, t, i, f, i, e, r, '1', '0']。

拥有此类字符后,可以使用谓词(如char_type/2)来推理每个字符的属性

例如:

?- char_type(i, T). T = 铝 ;T = 阿尔法 ;T = csym ; 等。

使用 DCG 表示标识符(例如您的标识符)的一般模式如下所示:

标识符 --> [L], { 字母(L) }, identifier_rest。 identifier_rest --> []。 identifier_rest --> [我], { letter_or_digit(I) }, identifier_rest。

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

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

相关内容

最新更新