Я попытался изменить пример 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)])
)
;