当我进一步深入研究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}.
但我确信,或者至少我希望,有更好的方法来解决这个问题。
其他人如何处理这种情况?有标准方法吗?我忽略了一些简单的事情吗?