现在我正在使用PLY为一小部分英语实现解析器。例如,我有一个名词的名单和一小组不及物动词,及物动词和动词动词,我可以用不同的组合来制作句子。但是,在我的词法分析器中,我遇到了有效定义属于每个标记的元素的问题。例如,对于名词,如果我希望包括的名称集是[Harry,Ron,Hermione,Draco,Snape],我能找到将这些值分配给名词“N”的唯一方法是
tokens = ['N', 'Vi', 'Vt', 'Vd', 'Conj']
t_N = r'Homer|Marge|Bart|Maggie|Lisa|SLH'
但这似乎是一种非常低效的分配方式,并没有留下扩展空间。例如,如果我想从文本文件中添加一个名称列表,那么就没有干净的方法。有没有办法将列表定义为PLY中令牌的规范?
答案 0 :(得分:1)
对于Ply,通常的解决方案是使用词法函数,而不是常量。函数的相关正则表达式将匹配任何单词(即[a-zA-Z]+
之类的东西)。函数的主体可以在一个字典中查找单词,该字典的键是已知单词,而whise值是词汇类别。
在Specification of Tokens手册的最后部分有一个字典方法示例。
对于一个简单的小子集来说这很好但是你最终会遇到许多英语单词可以有多个语法类别的问题(例如,可能是名词或动词的单词)。< / p>