delimitedList
не будет совпадать с пустым списком, поэтому ваше действие синтаксического анализа никогда не запустится. Я немного изменил ваш парсер, чтобы сделать список внутри []
необязательным, а затем запустил ваше действие hellRaiser
parse:
list_t = START + Optional(delimitedList(pyparsing_common.sci_real)) + END
list_t.setParseAction(lambda s, loc, toks: hell_raiser(s, loc, toks) if not toks else toks)
Получает желаемый результат:
[1.0, 1.0, 1.0]
[1.0, 1.0, 1.0]
[]
Empty lists not allowed '[]' (at char 0), (line:1, col:1)
[ ]
Empty lists not allowed '[]' (at char 0), (line:1, col:1)
Вы также можете заменить действие синтаксического анализа на логическое условие, в этом случае просто bool
- встроенный метод будет сравнивать список токенов, и если пустое условие не выполнится, то.
list_t.addCondition(bool, message="Empty lists not allowed", fatal=True)
Получает это:
[1.0, 1.0, 1.0]
[1.0, 1.0, 1.0]
[]
Empty lists not allowed (at char 0), (line:1, col:1)
[ ]
Empty lists not allowed (at char 0), (line:1, col:1)
Наконец, проверьте метод runTests()
на ParserElement
. Я много раз писал этот цикл «тест-строка-и-дамп-результаты-или-поймать-исключение», поэтому я решил просто добавить удобную функцию тестирования.