Я использую генератор синтаксического анализатора Jison для Javascript и у меня возникли проблемы с моей спецификацией языка.
Программа, которую я пишу, будет калькулятором, который может обрабатывать футы, дюймы и шестнадцатые.
Для этого у меня есть следующая спецификация:
%%
([0-9]+\s*"'")?\s*([0-9]+\s*"\"")?\s*([0-9]+\s*"s")? {return 'FIS';}
[0-9]+("."[0-9]+)?\b {return 'NUMBER';}
\s+ {/* skip whitespace */}
"*" {return '*';}
"/" {return '/';}
"-" {return '-';}
"+" {return '+';}
"(" {return '(';}
")" {return ')';}
<<EOF>> {return 'EOF';}
Большинство этих строк взяты из базовой спецификации калькулятора. Я просто добавил первую строку.
Регулярное выражение правильно сопоставляет футы, дюймы, шестнадцатые, например 6'4"
(шесть футов, 4 дюйма) или 4"5s
(4 дюйма, 5 шестнадцатых), с любым видом пробела между цифрами и индикаторами.
Проблема в том, что регулярное выражение также соответствует пустой строке. В результате лексический анализ всегда записывает FIS в начале строки, а затем анализ не выполняется.
Вот мой вопрос: есть ли способ изменить это регулярное выражение, чтобы гарантировать, что оно будет соответствовать только строке ненулевой длины?
EDIT
Хотя в регулярном выражении есть группы захвата, мне не нужно захватывать эти группы. Я знаю, что могу использовать группы без захвата, но это немного яснее без (?:...)
.