使用DCG解析时处理宽字符

时间:2015-03-05 09:33:01

标签: unicode prolog swi-prolog dcg widechar

当我进一步深入研究DCG的使用时,我发现自己被广泛的角色所困扰。

我正在尝试编写一个(或多或少)通用标记化器,并且正在测试它对this text file of Macbeth(我在recent /r/dailypogrammer challenge中遇到的)的勇气。隐藏在文本中的是广角Ã

很长一段时间我都不知所措,无论我尝试了什么调整,令牌器只回复了#34; false"。当然,我最终流行起来:因为我的DCG规则试图通过诉求code_type/2来标记他们的数据,分隔"单词"作为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}.

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

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

0 个答案:

没有答案