Я пытаюсь захватить имена (не начинающиеся с цифры) , которые могут содержать тире , например hello-world
. Моя проблема в том, что у меня также есть правила для одиночных штрихов и символов, которые конфликтуют с ним:
[A-Za-z][A-Za-z0-9-]+ { /* capture "hello-world" */ }
"-" { return '-'; }
">" { return '>'; }
Когда лексер читает hello-world->
, предыдущие правила дают hello-world-
и >
, тогда как я ожидал hello-world
, -
и >
для захвата по отдельности. Чтобы решить эту проблему, я исправил это следующим образом:
[A-Za-z][A-Za-z0-9-]*[A-Za-z0-9]+ { /* ensure final dash is never included at the end */ }
Это работает, за исключением однобуквенных слов, поэтому, наконец, я реализовал это:
[A-Za-z][A-Za-z0-9-]*[A-Za-z0-9]+ { /* ensure final dash is never included at the end */ }
[A-Za-z][A-Za-z0-9]* { /* capture possible single letter words */ }
Вопрос : Есть ли более элегантный способ сделать это?