<p>我最终找到了一个可接受的解决方案,它使用了<a href="http://pages.cpsc.ucalgary.ca/~aycock/spark/" rel="nofollow">SPARK</a>(用于语法分析/语法分析)和我自己的自动完成代码。在</p>
<p><strong>关于SPARK</strong></p>
<blockquote>
<p>SPARK stands for the Scanning, Parsing, and Rewriting Kit. It formerly
had no name, and was referred to as the "little language framework."
The first version (circa 1998) was described in the paper <a href="http://www.python.org/workshops/1998-11/proceedings/papers/aycock-little/aycock-little.ps" rel="nofollow">Compiling
Little Languages in Python</a> at the 7th International Python Conference.</p>
<p>SPARK is written in 100% pure Python, and is made available as open
source.</p>
</blockquote>
<p><strong>自动完成代码</strong></p>
<p>在以下代码中:</p>
<ul>
<li><code>category</code>是我们正在自动完成的单词。这是通过解析当前命令行获得的。例如:如果用户输入的是<em>“drink m”</em>,解析器将知道语法中定义的类别为“liquids”的单词。在</li>
<li>用户输入存储在列表中(<code>self.chars</code>)</li>
<li><code>_get_list_of_existing()</code>返回给定类别中现有单词的列表</li>
<li><code>_get_common_beginning()</code>返回-如果可用-多个匹配项的最长初始超序列。例如,如果用户输入正在写入<em>“ma”</em>,并且可能的自动补全单词是<em>[magnolia,magnaling glass]</em>,则<code>_get_common_beginning()</code>将返回<em>“magn”</em>。在</li>
</ul>
<p>以下是相关代码片段:</p>
<pre><code>def autocomplete(self, category):
'''
If possible, autocomplete a word according to its category.
'''
root = ''.join(self.chars).split()[-1] #The bit after the last space
pool = self._get_list_of_existing(category)
matches = [i for i in pool if i.find(root) == 0]
if len(matches) == 1:
match = matches[0]+' '
elif len(matches) > 1:
match = self._get_common_beginning(matches)
else:
return
self.chars.extend(list(match[len(root):]))
def _get_common_beginning(self, strings):
'''
Return the strings that is common to the beginning of each string in
the strings list.
'''
result = []
limit = min([len(s) for s in strings])
for i in range(limit):
chs = set([s[i] for s in strings])
if len(chs) == 1:
result.append(chs.pop())
else:
break
return ''.join(result)
</code></pre>