Поиск слов в верхушке дерева - не найдено ни одного совпадения
Я столкнулся с немного странной ситуацией.
Я пытаюсь разобрать измерения, используя верхушку дерева.
Например - 6'из 1/2"медной трубы, конечно, это также можно записать в футах, футах, дюймах, дюймах, дюймах, дюймах и т. Д. И т. Д.
так что у меня есть правило
измерение правил ('\'' / 'Foot' / 'foot' / 'Feet' / 'fts / / '' ' / 'Inches' / 'inch ' / 'Inch' / 'inch' / 'cm' / 'cms' / ' Сантиметры '/' Сантиметры '/' Сантиметр '/' Сантиметр '/' м '/' мс '/' Метры '/' метры '/' Метр '/' метр '/' фунт '/' фунты ' / 'Pounds' / 'pounds' / 'Pound' / 'pound') (s? ')' / S) {значение по умолчанию [: измерение, текстовое_значение] конец} пространство конца правила [\s]+ конец
Когда я ввожу "6 дюймов", "6 фунтов", "6 метров", все работает отлично, и я получаю свой номер и результаты измерений.
Когда я ввожу "6 метров", метры не анализируются должным образом.
Большинство измерений работают нормально, в измерениях, которые я здесь представил, пропускаются только "метры" и "фунт" (но я уверен, что буду добавлять дополнительные измерения в будущем.
Любые идеи относительно того, почему я буду испытывать это?
Согласно запросу, более "урезанная" версия полной грамматики
грамматика FullMeasurements Правило full_product меры с? alternate_measure product_name { значение по умолчанию [:full_product, text_value] конец } конец правила меры single_measure / dual_measure / amount { меры по определению [:measure, text_value] разве что text_value.blank? конец } конец правило двойного измерения количество с? single_measure { значение по умолчанию [:dual_measure, text_value] разве что text_value.blank? конец } конец правило alternate_measure '(' s? single_measure { значение по умолчанию [:alternate_measure, text_value] разве что text_value.blank? конец } конец правило single_measure (range_number / number) s? измерение option_secondary_measurements { значение по умолчанию [:single_measure, text_value] конец } конец rule option_secondary_measurements измерение? { значение по умолчанию [:option_secondary_measurements, text_value] конец } конец количество правил (range_number / number) s? делитель? { значение по умолчанию [: количество, текстовое значение] конец } конец измерение правил ('\'' / 'Foot' / 'foot' / 'Feet' / 'foot '/ "" / "Дюймы" / "дюймы" / "Дюймы" / "дюймы" / "см" / "смс" / "сантиметры" / "сантиметры" / "сантиметр" / "сантиметр" / 'm' / 'ms' / 'Meters' / 'meter'/ 'Meter' / 'meter' / "фунты" / "фунты" / "фунты" / "фунты" / "фунты" / "фунты") (s? ')' / s) { значение по умолчанию [: измерение, текстовое значение] конец } конец делитель правил "Икс" конец правило product_name! измеряет слова + { значение по умолчанию [:product_name, text_value] конец } конец номер правила frac_number / normal_number Additional_frac { значение по умолчанию [:number, text_value] конец } конец rule option_frac frac_number? { значение по умолчанию [:option_frac, text_value] конец } конец правило frac_number (s? обычный_ номер) / 'обычный_ номер) { значение по умолчанию [:frac_number, text_value] конец } конец правила слова [0-9a-zA-Z\-()&.%'*\ S]+ { значение по умолчанию TEXT_VALUE конец } конец правило регулярный номер [0-9\.]+ { значение по умолчанию TEXT_VALUE конец } конец пространство правил [\ S] + конец конец
2 ответа
Так как ПЭГ жадные и /
это упорядоченное чередование, ваш measurement
rule соответствует буквальному тексту "meter", и ваша грамматика завершается ошибкой, потому что не может найти следующее правило, которое соответствует оставленному символу "s". В отличие от регулярных выражений, PEG не будут возвращаться к предыдущим успешным совпадениям при неудачном.
Измените порядок элементов в вашем правиле, чтобы сначала получить множественное число, и вы должны быть в порядке.
Phrogz был на правильном пути, но это не "метр", который сопоставляется первым, а "m", который не оставляет ничего, чтобы соответствовать "eter" или "eters", которые остались.