Я думаю, я бы определил вещи по-другому, таким образом, чтобы избежать проблемы, с которой нужно начать, что-то вроде:
value: num
| stringvalue
| list
;
items:
| items value
;
list: LEFTBRACE items RIGHTBRACE;
Редактировать: Отделение списков чисел от списков строк не может быть сделано чисто, если вы не удалите пустые списки. Возникающая проблема заключается в том, что вы хотите разрешить включение пустого списка в список чисел или списка строк, но просмотр самого пустого списка не позволяет анализатору решить, какой именно. Например:
[[] [] [] [] [] [] [] [] 1]
Чтобы выяснить, что это за список, парсер должен смотреть вперед до 1
- но парсер LALR (N) может только смотреть на N символов, чтобы принять это решение. Yacc (и Byacc, Bison и т. Д.) Выполняют только LALR (1), поэтому они могут смотреть вперед только на один символ. Это оставляет несколько возможностей:
- полностью исключить возможность пустых списков
- Пусть лексер обрабатывает произвольное количество последовательных пустых списков как один токен
- использовать генератор синтаксического анализатора, который не ограничен грамматикой LALR (1)
Однако внутри грамматики yacc я не думаю, что вы можете многое сделать - ваша грамматика просто не соответствует ограничениям yacc.