Я разбираю язык, в котором есть как <
, так и <<
. В моем определении Алекса у меня есть что-то, что содержит что-то вроде
tokens :-
"<" { token Lt }
"<<" { token (BinOp Shl) }
поэтому всякий раз, когда я сталкиваюсь с <<
, это обозначается как сдвиг влево, а не как сдвиг меньше. Обычно это хорошо, так как после токенизации я выбрасываю пробелы и хочу различать 1 < < 2
и 1 << 2
. Однако бывают и другие случаи, когда мне хотелось бы, чтобы <<
читалось как два <
. Например, у меня есть такие вещи, как
<<A>::B>
который я хочу читать как
< < A > :: B >
Очевидно, я могу попытаться настроить правила синтаксического анализатора Happy, чтобы учесть дополнительные случаи, но это плохо масштабируется. В других генераторах императивных синтаксических анализаторов я мог бы попытаться сделать что-то вроде отодвигания «части» токена (что-то вроде push_back("<")
, когда я столкнулся с <<
, но мне нужно было только <
).
Была ли у кого-нибудь еще такая проблема, и если да, то как вы с ней боролись? Есть ли способы «отталкивания» жетонов в Happy? Должен ли я вместо этого попытаться сохранить токен пробела (на самом деле я склоняюсь к последнему варианту - хотя это огромная головная боль, это позволило бы мне справиться с <<
, просто убедившись, что между двумя <
нет пробела).