Не используйте регулярные выражения. То, что вы делаете, это вывод типа, и я предполагаю, что вы делаете это для школы. Они захотят, чтобы вы узнали другой путь, такой как логическое объединение.
Вы полагаетесь на то, что все типы всегда различны. Что если 0 или 1 назначено логическому значению? Регулярные выражения не очень хороши для сокращения ввода. Ваша программа в лучшем случае выдает список идентификаторов каждого типа. Есть лучшие подходы.
Если вы находитесь в коммерческой среде, ваше решение будет полностью не масштабируемым, не поддерживаемым, ненадежным и медленным в реализации, поскольку, по вашему собственному признанию, это не ваша сильная сторона.
Если вы не просто делаете домашнюю работу, у вас должен быть доступ к парсеру для этого языка. Если вы этого не сделаете, вы должны начать его с генератора синтаксических анализаторов, таких как Bison (или что-то еще в стиле).
Если вы делаете домашнее задание, я настоятельно рекомендую нажать на книгу.
Редактировать: Я забыл сказать, что делать с Bison: vP. У вас есть структура данных для каждой переменной. Он должен содержать набор возможных типов. Скажем, unsigned int
с одним битом, представляющим каждый тип, enum type_bits { double_bit = 1, long_bit = 2, string_bit = 4, … };
. Начните с установки всех битов в 1; т.е. type_map = (type_bits) -1;
. Когда вы сталкиваетесь с каждой операцией, маскируйте биты, которые несовместимы с ней. Когда вы закончите, у вас будет определенное количество битов. Примените правила приоритета, если их больше одного, сгенерируйте ошибку, если их нет.