如何在 PLY 中将列表的元素指定为令牌的规范

How to specify elements of a list as a token's specifications in PLY

现在我正在使用 PLY 为一小部分英语实现解析器。例如,我有一个名词列表和一小部分不及物动词、及物动词和与格动词,我可以用这些的不同组合造句。但是,在我的词法分析器中,我在有效定义属于每个标记的元素方面遇到了问题。例如,对于名词,如果我希望包含的名称集是 [Harry、Ron、Hermione、Draco、Snape],我能找到的将这些值分配给名词的标记 "N" 的唯一方法是

tokens = ['N', 'Vi', 'Vt', 'Vd', 'Conj']
t_N = r'Homer|Marge|Bart|Maggie|Lisa|SLH'

但这似乎是一种非常低效的分配方式,而且没有留出扩展空间。例如,如果我想从一个文本文件中添加一个名称列表,就没有干净的方法可以做到这一点。有没有办法在 PLY 中将列表定义为令牌的规范?

对于 Ply,通常的解决方案是使用词法函数,而不是常量。该函数关联的正则表达式将匹配任何单词(即 [a-zA-Z]+ 之类的东西)。函数体可以在字典中查找单词,字典的键是已知单词,值是词汇类别。

本手册关于 Specification of Tokens 的部分末尾有一个字典方法的示例。

这对于一个简单的小子集来说效果很好,但你最终会 运行 进入一个问题,即许多英语单词可以有多个语法类别(例如,可以是名词或动词)。