Pyparsing: как реализовать специальную обработку комментариев в стиле C? - PullRequest
1 голос
/ 10 февраля 2012

Я хочу воспользоваться преимуществом переменной cStyleComment, но вместо того, чтобы просто игнорировать эти комментарии, я хочу обработать их специально.Есть ли какой-нибудь способ заставить pyparsing вызывать мой обработчик для части ввода, которую он распознает как комментарий, прежде чем он будет отброшен?директивы внутри комментариев.

1 Ответ

2 голосов
/ 10 февраля 2012

Нет ничего, присущего любому из выражений xxxStyleComment, определенных в pyparsing, что заставляет их игнорироваться.Они там для удобства, тем более что некоторые форматы комментариев легко ошибиться.Они не будут проигнорированы, если вы не вызовете метод ignore в вашей более крупной грамматике, например:

cHeaderParser.ignore(cStyleComment)

(где cHeaderParser может быть чем-то, что вы написали, чтобы прочитать файлы .h для извлечения APIинформация, например.)

И наличие встроенного обратного вызова для обработчика является встроенным, просто используйте cStyleComment.setParseAction(commentHandler).Pyparsing может обрабатывать действия синтаксического анализа с любой из этих подписей:

def commentHandler(inputString, locn, tokens):
def commentHandler(locn, tokens):
def commentHandler(tokens):
def commentHandler():

Если ваш commentHandler возвращает строку или список строк, или новый ParseResults, они будут использоваться для замены входных токенов - если он возвращает Noneили пропускает оператор return, затем используется объект токенов.Вы также можете изменить объект токенов на месте (например, добавив новые имена результатов).

Таким образом, вы могли бы написать что-то вроде этого, чтобы заглавные буквы ваших комментариев:

def commentHandler(tokens):
    return tokens[0].upper()    
cStyleComment.setParseAction(commentHandler)

(действие разборатак просто, как это можно было бы записать cStyleComment.setParseAction(lambda t:t[0].upper()))

При написании такого преобразующего действия разбора, скорее всего, будет использоваться transformString вместо parseString,

print cStyleComment.transformString(source)

Thisнапечатает исходный код, но все комментарии будут в верхнем регистре.

...