Пропускать части ввода в boost :: spirit :: qi, если вызов функции возвращается true

В последнее время я играл с boost :: spirit :: qi и пытался написать свой собственный (очень, очень простой) язык сценариев, который он будет анализировать. У меня были проблемы, когда я добрался до операторов if в скрипте. Мне нужен синтаксический анализатор, чтобы пропустить части ввода, если вызов функции вернется в норму.

Например, у меня есть токен, определенный как принимающий имена переменных (a-zA-Z_) и набор сравнения для принятия «>» или «‹ ». Пример кода ниже.

comparison_statement = token >> comparison >> token;
statement            = lit("if ") >> comparison_statement[&compare] >> "then";

qi::phrase_parse(first, last, script, space);  // This call the parser

Как мне пропустить следующий раздел, если сравнение функций вернется в норму?


person Codahk    schedule 20.12.2011    source источник
comment
Это именно то, что epsilon parser для; ты пробовал это?   -  person ildjarn    schedule 20.12.2011
comment
Нет, я новичок в Boost и никогда такого не видел. Я просмотрел документацию, но это немного сбивает с толку, не могли бы вы дать мне пример того, как ее использовать? Спасибо :)   -  person Codahk    schedule 20.12.2011
comment
Параграф «Семантический предикат» является подходящим примером.   -  person ildjarn    schedule 20.12.2011
comment
Я чувствую себя глупо, спрашивая, но как это можно использовать, чтобы пропустить часть ввода? Я читаю это так, как когда функция возвращает false, возникает ошибка синтаксического анализа. Как это можно использовать как условное?   -  person Codahk    schedule 20.12.2011
comment
Имея ветвь eps на одной стороне альтернативы (|) и что-то еще (возможно, в вашем случае, noop) на другой стороне альтернативы.   -  person ildjarn    schedule 20.12.2011
comment
Ооооо, теперь я понял. Я (довольно глупо) читал это, как будто неудача означала бы отказ всего синтаксического анализа, а не только этого теста. Большое спасибо :)   -  person Codahk    schedule 20.12.2011
comment
Никакой глупости; никто не скажет, что у Spirit нет кривой обучения. : -]   -  person ildjarn    schedule 20.12.2011


Ответы (1)


Условное выражение в синтаксическом анализаторе можно записать с помощью Epsilon Parser. Это вызовет функцию, которую вы ему предоставили, и если эта функция вернет false, эта конкретная проверка не удастся и перейдет к следующему или.

Например:

qi::rule<Iterator, std::string(), ascii::space_type> rool;
rool = a | b | eps(f) | d
person Codahk    schedule 20.12.2011