Pyparsing, реализующий простую команду сценария - PullRequest
0 голосов
/ 25 января 2012

Мне нужно реализовать очень простую грамматику для разбора простого командного языка, который будет читаться из файла. Я хотел бы использовать PyParsing:

Примеры команд во входном файле:

## comment line - skip to next
CopyFile c:\temp\file1.txt  c:\temp\file2.txt
CreateDir "Junk"
MoveFile c:\temp\file1.txt  c:\temp\file2.txt
CreateFolder "Name"
DeleteFolder "Name"
FolderStruct "startNode"
FolderList "folderName" 

В идеале результатом анализа должна быть команда, за которой следуют необязательные аргументы.

Ответы [ 2 ]

2 голосов
/ 25 января 2012

Чтобы разделить строку в список аргументов, аналогично тому, как это делает оболочка Unix, вы можете использовать shlex module :

import fileinput
from shlex import shlex

def split(s):
    lex = shlex(s, posix=True)
    lex.escape = '' # treat all characters including backslash '\' literally
    lex.whitespace_split = True
    return list(lex)

for line in fileinput.input():
    args = split(line)
    if args:
       print(args)

Output

Первый элемент в каждом списке - это команда, остальные параметры:

['CopyFile', 'c:\\temp\\file1.txt', 'c:\\temp\\file2.txt']
['CreateDir', 'Junk']
['MoveFile', 'c:\\temp\\file1.txt', 'c:\\temp\\file2.txt']
['CreateFolder', 'Name']
['DeleteFolder', 'Name']
['FolderStruct', 'startNode']
['FolderList', 'folderName']
1 голос
/ 25 января 2012

См. Мой пример грамматики синтаксического анализа формы в ответ на этот вопрос на странице обсуждения Pyparsing wiki: http://pyparsing.wikispaces.com/message/view/home/49369254. Каждая конструкция грамматики отображается в тип класса, который может быть создан из проанализированных токенов. Когда вы закончите, вы фактически десериализовали свой входной текст в список экземпляров классов, которые сами могут быть определены с помощью методов execute или __call__ для выполнения желаемой задачи. Вы можете увидеть дальнейшие примеры этого в примере SimpleBool.py на странице примеров pyparsing wiki. Также посмотрите пример парсера приключенческой игры, который я представил на PyCon '06, вы можете найти ссылки на http://www.ptmcg.com/geo/python/index.html.

...