Я заметил странный побочный эффект в pyparsing:
При использовании .ignore() в расширенном наборе синтаксического анализатора parseString(..., parseAll = True) прекращает проверку всей строки на символе комментария. Лучше объяснить код ниже.
Как это исправить без использования stringEnd?
пример:
def test():
import pyparsing as p
unquoted_exclude = "\\\"" + "':/|<>,;#"
unquoted_chars = ''.join(set(p.printables) - set(unquoted_exclude))
unquotedkey = p.Word(unquoted_chars)
more = p.OneOrMore(unquotedkey)
more.ignore("#" + p.restOfLine)
# ^^ "more" should ignore comments, but not "unquotedkey" !!
def parse(parser, input_, parseAll=True):
try:
print input_
print parser.parseString(input_, parseAll).asList()
except Exception as err:
print err
parse(unquotedkey, "abc#d")
parse(unquotedkey, "abc|d")
withstringend = unquotedkey + p.stringEnd
parse(withstringend, "abc#d", False)
parse(withstringend, "abc|d", False)
Выход:
abc#d ['abc'] <--- should throw an exception but does not abc|d Expected end of text (at char 3), (line:1, col:4) abc#d Expected stringEnd (at char 3), (line:1, col:4) abc|d Expected stringEnd (at char 3), (line:1, col:4)