Я пытаюсь написать грамматику с PLY, которая будет анализировать пути в файле. Я столкнулся с проблемами сокращения конфликтов, и я не уверен, как изменить грамматику, чтобы исправить ее. Вот пример файла, который я пытаюсь проанализировать. Путь/имя файла может быть любым допустимым контуром linux.Как написать грамматику PLY для разбора путей?
file : ../../dir/filename.txt
file : filename.txt
file : filename
Итак, вот грамматика, которую я написал.
header : ID COLON path
path : pathexpr filename
pathexpr : PERIOD PERIOD DIVIDE pathexpr
| PERIOD DIVIDE pathexpr
| ID DIVIDE pathexpr
|
filename : ID PERIOD ID
| ID
Вот мои жетоны. Я использую библиотеку ctokens, включенную в PLY. Просто чтобы сэкономить усилия в написании моих собственных.
t_ID = r'[A-Za-z_][A-Za-z0-9_]*'
t_PERIOD = r'\.'
t_DIVIDE = r'/'
t_COLON = r':'
Так что я считаю, что есть сдвиг уменьшить конфликт в «имя файла» правила потому, что анализатор не знает, следует ли уменьшить маркер «ID» или перейти на «ID ПЕРИОДА ID». Я думаю, что есть еще одна проблема с отсутствием пути («filename»), где он будет использовать токен в pathexpr вместо сокращения до пустого.
Как я могу исправить грамматику для обработки этих случаев? Может, мне нужно изменить свои жетоны?
Спасибо за помощь! Изменение с правой рекурсивной налево фиксировало проблему. – jjm012