Разбор python с помощью PLY, как закодировать часть отступа и отступа

Я пытался разобрать определение функции для языка python с помощью PLY. Я сталкиваюсь с проблемами, связанными с отступом. Например, для оператора for я хотел бы знать, когда заканчивается блок. Я прочитал грамматику Python здесь: http://docs.python.org/2/reference/grammar.html И грамматика для этой части:

for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite]
suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT

Я не знаю, как описать токены INDENT и DEDENT с помощью PLY. Я пытался что-то вроде:

def t_indentation(t):
    r'    |\t'
    #some special treatment for the indentation.

Но похоже, что PLY считает, что регулярные выражения с пробелами соответствуют пустой строке и не создают лексер... Даже если бы мне удалось получить токен INDENT, я не уверен, как получить токен DEDENT...

Есть ли способ сделать это с помощью PLY?


person joetde    schedule 04.11.2013    source источник
comment
Правила относительно INDENT и DEDENT в Python более сложны, чем четыре пробела или табуляция. В других генераторах синтаксических анализаторов проблема решается с помощью семантических действий, которые определяют, является ли количество начального пробела допустимым отступом или отступом, или путем вмешательства токенизатора для вставки токенов INDENT или DEDENT.   -  person Apalala    schedule 05.11.2013
comment
Да, я думал о внедрении токена с помощью функции t_indentation. Регулярное выражение было неправильным для PLY, r'[ ]{4}|\t' лучше. Спасибо.   -  person joetde    schedule 06.11.2013
comment
Кажется, что с plyplus есть более простой способ сделать это: github.com/erezsh/plyplus/blob/master/plyplus/grammars/   -  person joetde    schedule 03.01.2014


Ответы (2)


Вы должны использовать состояния для разбора INDENT и UNDENT.

пример разбора языка, подобного python

person woshifyz    schedule 26.11.2013
comment
В этом примере не используются состояния для анализа INDENT и UNDENT; он использует этап постобработки. - person ibid; 05.04.2016

PLY включает в свои примеры один для подмножества Python, чтобы продемонстрировать, как обрабатывать отступы:

https://github.com/dabeaz/ply/blob/master/example/GardenSnake/GardenSnake.py

person Ioannis Filippidis    schedule 15.08.2016