я получил следующее (сильно урезанная) Happy грамматикуShift/уменьшить конфликт в Happy грамматике
%token
'{' { Langle }
'}' { Rangle }
'..' { DotDot }
'::' { ColonColon }
'@' { At }
mut { Mut }
ident { Ident }
%%
pattern
: binding_mode ident at_pat { error "identifier pattern" }
| expr_path { error "constant expression" }
| expr_path '{' '..' '}' { error "struct pattern" }
binding_mode
: mut { }
| { }
at_pat
: '@' pat { }
| { }
expr_path
: expr_path '::' ident { }
| ident { }
который имеет конфликтов сдвиг/свёртка вокруг идентификаторов шаблонов. По умолчанию Happy выбирает смещение, но в этом случае это не то, что я хочу: он пытается обучить все в constant expression
, даже когда это может быть identifier pattern
.
Я читал, что приоритет/ассоциативность - это способ решить эту проблему, но ничего, что я добавил, не удалось сдвинуть грамматику в правильном направлении (честно говоря, я принимал в основном выстрелы в темноте).
Используя некоторые очевидные лексемизацию, я хотел бы иметь:
x
с получениемidentifier pattern
mut x
с получениемidentifier pattern
std::pi
с получениемconstant expression
point{..}
с получениемstruct pattern
std::point{..}
с получениемstruct pattern
В основном, если не является {
или ::
маркер ждет, чтобы быть потреблен, идентификатор должен идти в identifier pattern
случае.
Я прошу прощения, если мой вопрос не ясно - часть проблемы заключается в том, что у меня трудное время точного определения того, что проблема даже есть. :(
Я думаю, вы пропустили некоторые из постановок. Как было показано, конфликта нет (и нет константы) – rici
@rici Это может быть очень хорошо. Если это так, я удалю вопрос и рассмотрю его более тщательно перед повторной отправкой! Не предполагается создание 'constant_expression' - это просто сообщение, которое я выбрал для печати, столкнувшись с вариантом' expr_path' 'pattern'. И я думаю, что должен быть хотя бы один конфликт смены/сокращения - с учетом только «Идентификации», я могу перейти от «шаблона» к варианту «expr_path» или вообще уменьшить идентификатор binding_mode at_pat. – Alec
Хорошо, это было бы яснее для меня, если бы вы охарактеризовали результаты как производственные, а не действия; Я склонен игнорировать действия. Предполагается ли, что утерянный идентификатор будет шаблоном? Почему бы вам просто не написать грамматику, чтобы сказать это? – rici