Я пишу DSL и использую лексер Boost Spirit для токенизации моего ввода. В моей грамматике мне нужно правило, подобное этому (где tok
— лексер):
header_block =
tok.name >> ':' >> tok.stringval > ';' >>
tok.description >> ':' >> tok.stringval > ';'
;
Вместо того, чтобы указывать зарезервированные слова для языка (например, «имя», «описание») и заниматься их синхронизацией между лексером и грамматикой, я хочу просто размечать все, что соответствует [a-zA-Z_]\w*
, как один тип токена (например, tok.symbol
), и пусть грамматика разберется. Если бы я не использовал лексический анализатор, я мог бы сделать что-то вроде этого:
stringval = lexeme['"' >> *(char_ - '"') >> '"'];
header_block =
lit("name") >> ':' >> stringval > ';' >>
lit("description") >> ':' >> stringval > ';'
;
С лексером в миксе я могу скомпилировать следующее правило, но, конечно, оно соответствует большему, чем мне нужно, оно не заботится о конкретных значениях символов «имя» и «описание»:
header_block =
tok.symbol >> ':' >> tok.stringval > ';' >>
tok.symbol >> ':' >> tok.stringval > ';'
;
Я ищу что-то вроде этого:
header_block =
specific_symbol_matcher("name") >> ':' >> tok.stringval > ';' >>
specific_symbol_matcher("description") >> ':' >> tok.stringval > ';'
;
Дает ли Ци что-нибудь, что я могу использовать вместо того, чтобы specific_symbol_matcher
махать руками? Я бы предпочел не писать свой собственный сопоставитель, если я могу приблизиться, используя предоставленные материалы. Если я должен написать свой собственный сопоставитель, может ли кто-нибудь предложить, как это сделать?
tok.symbol
равноlex::token_def<std::string>
. Моя проблема заключается в сопоставлении этого строкового атрибута с использованием выражения в грамматике. Я могу опубликовать лексер, если это необходимо, но если это так, я бы предпочел составить небольшой тестовый пример. - person Tim Ruddick   schedule 17.07.2012