Реализация "НЕ" в boost :: spirit mini_c - PullRequest
0 голосов
/ 28 августа 2010

Я попытался изменить пример boost :: spirit на mini_c, чтобы он соответствовал моему существующему словарю.

Поэтому я добавил оператор «НЕ, который должен вести себя как«! »:

unary_expr =
        primary_expr
    |   ("NOT" > primary_expr           [op(op_not)]) // This does not work
    |   ('!' > primary_expr             [op(op_not)])
    |   ('-' > primary_expr             [op(op_neg)])
    |   ('+' > primary_expr)
    ;

Я могу скомпилировать модифицированный исходный код, но когда я пытаюсь его выполнить, он не может разобрать. Как я могу решить это?

EDIT: Поскольку я хочу получить доступ к внешним переменным, я сделал еще одну модификацию для составления списка этих переменных при компиляции:

identifier %=
    raw[lexeme[alpha >> *(alnum | '§' | '_' | '.' | '-' )]]
    ;
variable =
       identifier      [add_var(_1)]
    ;

Где add_var и идентификатор определены как

rule<Iterator, std::string(), white_space> identifier;
function<var_adder> add_var;

Если я не использую эту модификацию, можно использовать «НЕ». С модификацией, использование «НЕ» приводит к ошибке синтаксического анализа.

РЕДАКТИРОВАТЬ 2: Следующие условные выражения работают, хотя:

logical_expr =
    relational_expr
    >> *(  ("AND" > relational_expr     [op(op_and)])
        |   ("OR" > relational_expr     [op(op_or)])
        )
    ;

1 Ответ

2 голосов
/ 29 августа 2010

С вашим изменением небольшой тест:

int main()
{
    return NOT 1;
}

успешно анализирует и возвращает 0.Так что для меня не очевидно, что не работает для вас.Не могли бы вы также привести пример неудачного ввода?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...