コマンドラインをpyparsingで解析するプログラムに取り組んでいます。readline ライブラリを使用して、コマンドの編集と補完を提供します。
アプリケーションのコンテキストでは、有効なコマンド ラインはパス(オプション) であり、その後にコマンド名(オプション) といくつかのパラメーター(これもオプション) が続きます。
コマンド補完を提供するために、アプリケーションはコマンド ラインを解析して、補完する要素がパス、コマンド、補完のいずれであるかを確認します。readline は、補完が必要な要素のインデックスを提供します。これらのインデックスを、パスの場所、コマンド名、または pyparsing によって返された解析結果のパラメーターと照合したいと考えています。
さまざまなトークンの場所を取得し、引き続き setResultsName() を使用してトークンに名前を付けるにはどうすればよいですか?
from pyparsing import Optional, Regex, Word
from pyparsing import alphanums
class Shell(object):
def __init__(self):
# Simplified grammar of the command line
# path command parameters
command = Word(alphanums + '_').setResultsName('command')
bookmark = Regex('@([A-Za-z0-9:_.]|-)+')
pathstd = Regex('([A-Za-z0-9:_.]|-)*' + '/' + '([A-Za-z0-9:_./]|-)*') \
| '..' | '.'
path = (bookmark | pathstd | '*')('path')
parser = Optional(path) + Optional(command) # + Optional(parameters)
self.parser = parser
def parse_cmdline(self, line):
parse_results = self.parser.parseString(line)
path = parse_results.path
command = parse_results.command
return (parse_results, path, command)
def complete(self):
"""Completion method called by readline"""
cmdline = readline.get_line_buffer()
(result_trees, path, command) = self.parse_cmdline(cmdline)
beg = readline.get_begidx()
end = readline.get_endidx()
prefix = cmdline[beg:end]
# if beg == path.location:
# completion = self.get_path_completion()
# elif beg == command.location:
# completion = self.get_command_completion()
# elif beg in parameters.location:
# completion = self.get_parameter_completion()