Я играю с бизоном и флексом, чтобы понять, как работают переводчики. Я уже сделал несколько вещей, как диапазон ({INT:INT}
или же {INT:INT:INT}
), строки ({строка «здесь идет любой текст»}) и т. д., но я не могу решить, какой должен быть правильный способ помочь зубру понять, если пользователь ввел массив в форме [INT, INT, ID, ID, INT, ..., INT, ID, ID...]
?
Первое, что приходит в голову, это использовать ключевое слово flex BEGIN
и затем посмотрите до конца строки, но это кажется глупым, поскольку вам нужно много вещей, например, чтобы понять, является ли следующий член INT или ID, и это не очень хороший способ. Что я могу сделать еще? Я бы предпочел сделать это с бизоном, но я не знаю, как заставить бизона выглядеть рекурсивно между [
а также ]
захватить все, что они содержат. Как мне это сделать?
Заранее спасибо!
Просто — просто сделайте рекурсивное правило.
expr :- INT | ID;
array_expr :- array_expr expr | expr;
array :- '[' array_expr ']';
Прошло много времени с тех пор, как я снялся в Bison, но это должно быть довольно близко, чтобы исправить.
Других решений пока нет …