Поиск слов в верхушке дерева - не найдено ни одного совпадения

Я столкнулся с немного странной ситуацией.

Я пытаюсь разобрать измерения, используя верхушку дерева.

Например - 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", которые остались.

Другие вопросы по тегам