Вот ваш пример кода с некоторыми небольшими изменениями. (Мне действительно не нравится обратная косая черта, и вам может показаться, что при встраивании текстовых примеров в ваши сценарии работа с тройными кавычками проще для глаз.) В частности, я показываю использование locatedExpr
. Это может быть то, что вы действительно хотели увидеть. Также см. Этот вопрос SO: Pyparsing: получить местоположение токена в имени результата
import pyparsing as pp
#a sample C header file
lines = """
#ifndef HEADER_FILE_H
#define HEADER_FILE_H 1
/* code is here */
#endif /* HEADER_FILE_H */
"""
LBRACE,RBRACE,LBRACK,RBRACK,LT,GT,LPAREN,RPAREN,DQ,SEMI = map(pp.Suppress,'{}[]<>()";')
CIDENT = pp.Word(pp.alphas + "_", pp.alphanums + "_") #any C identifier
LCOMMENT = pp.Suppress("/*")
RCOMMENT = pp.Suppress("*/")
def make_directive(s, pound=pp.Literal("#")):
return pp.Combine(pound + s, adjacent=False)
ifndef = make_directive("ifndef")
ifnotdefined = make_directive("if") + pp.Literal("!defined")
define = make_directive("define")
endif = make_directive("endif")
comment = pp.Optional(LCOMMENT
+ CIDENT("guardname_endif")
+ RCOMMENT)("guard_end_comment")
includeguardifndef = ((ifndef | ifnotdefined)
+ pp.Optional(LPAREN)
+ CIDENT("guardname_ifndef_val")
+ pp.Optional(RPAREN))
includeguard = (define
+ CIDENT("guardname_define_val")
+ pp.Optional(pp.Literal("1")("guard_is_one")))
includeguard_top = includeguardifndef + includeguard
includeguardendif = endif("includeguardendif") + comment
# parse the header
parser = includeguard_top + pp.SkipTo(includeguardendif).suppress() + includeguardendif
print(parser.parseString(lines).dump())
# parse the header, with locns
loc = pp.locatedExpr
parser = loc(includeguard_top) + pp.SkipTo(includeguardendif).suppress() + loc(includeguardendif)
print(parser.parseString(lines).dump())
Печать:
['#ifndef', 'HEADER_FILE_H', '#define', 'HEADER_FILE_H', '1', '#endif', 'HEADER_FILE_H']
- guard_end_comment: ['HEADER_FILE_H']
- guard_is_one: '1'
- guardname_define_val: 'HEADER_FILE_H'
- guardname_endif: 'HEADER_FILE_H'
- guardname_ifndef_val: 'HEADER_FILE_H'
- includeguardendif: '#endif'
[[1, '#ifndef', 'HEADER_FILE_H', '#define', 'HEADER_FILE_H', '1', 46], [69, '#endif', 'HEADER_FILE_H', 95]]
[0]:
[1, '#ifndef', 'HEADER_FILE_H', '#define', 'HEADER_FILE_H', '1', 46]
- guard_is_one: '1'
- guardname_define_val: 'HEADER_FILE_H'
- guardname_ifndef_val: 'HEADER_FILE_H'
- locn_end: 46
- locn_start: 1
- value: ['#ifndef', 'HEADER_FILE_H', '#define', 'HEADER_FILE_H', '1']
[1]:
[69, '#endif', 'HEADER_FILE_H', 95]
- guard_end_comment: ['HEADER_FILE_H']
- guardname_endif: 'HEADER_FILE_H'
- includeguardendif: '#endif'
- locn_end: 95
- locn_start: 69
- value: ['#endif', 'HEADER_FILE_H']