У меня есть 2 выражение:Как назначить приоритет двум перекрывающимся выражениям? (Ragel)
ident = alpha . (alnum|[._\-])*;
string = (printable1)+;
# Printable includes almost all Windows-1252 characters with glyphs.
main := (ident % do_ident | string % do_string)
# The do_* actions have been defined, and generate tokens.
Очевидно, что любая идент является строкой. У Ragel есть приоритетные операторы, чтобы преодолеть это. Но независимо от того, как я пытался установить приоритеты, либо некоторые idents выполняют оба действия, либо игнорируются некоторые допустимые строки (допустимые строки с допустимым идентификатором в качестве префикса, например: ab $).
Я нашел один способ обойти это, без использования приоритетов:
main := (ident % do_ident | (string - ident) % do_string)
Но если у меня есть больше, чем несколько перекрывающего выражения, это будет получить громоздкое. Это единственный практический путь?
Любая помощь с правильным способом для этого будет оценена по достоинству.
У меня такой же вопрос, как и вы. Вы находите хороший ответ? Или просто держите его, как вы предложили? – sim
В итоге я перешел с моим методом выше, вычитая различные определения с более высоким приоритетом из более низких приоритетов. Оказалось, что мне нужно было сделать это только для 4 из 14 образцов. Полученный код не очень хорош, но он работает. –