0

当我深入研究 DCG 的使用时,我发现自己被宽字符所阻碍。

我正在尝试编写一个(或多或少)通用标记器,并针对Macbeth 的这个文本文件(我在最近的 /r/dailypogrammer 挑战中遇到)测试它的勇气。隐藏在文本中的这里和那里是宽字符Ã

很长一段时间我都不知所措,无论我尝试什么调整,tokenizer 都只是回答“错误”。当然,我终于明白了:因为我的 DCG 规则试图通过诉诸 来标记他们的数据,将code_type/2“单词”分隔为 type 的连续字符csym,用 分隔标点符号char_type(C, punct)等,它们在遇到 时失败Ã,表示为[195, 131]

发现问题后,我不知道如何干净地处理这些代码序列。理想情况下,我想将所有宽度的图形字符分组为“单词”的一部分,除非它们是明确的标点符号。我尝试过在各种不同的编码下读取文件,但这似乎没有帮助,大概是因为我仍然依赖code_type/2.

目前,我设计了以下令人讨厌的解决方案作为任何非 ascii 字符的包罗万象:

% non ascii's
nasciis([C])     --> nascii(C), (call(eos), !).
nasciis([C]),[D] --> nascii(C), [D], {D < 127}.
nasciis([C|Cs])  --> nascii(C), nasciis(Cs).

nascii(C)        --> [C], {C > 127}.

但我敢肯定,或者至少我希望,有更好的方法来解决这个问题。

其他人如何处理这种情况?有标准方法吗?我忽略了一些简单的事情吗?

4

0 回答 0