Мне нужен простой лексический анализатор, который сообщает о ошибках цикла в C/C++.Где я могу получить лексический анализатор, способный сообщать о ошибках цикла в C или C++?
ответ
flex/lex и bison/yacc - два хороших инструмента для развития таких вещей. Ошибки в отчетах для цикла будут казаться очень специфическими, что вам нужно, поэтому вам, возможно, придется написать свой собственный лексер и парсер, чтобы он делал то, что вы хотите.
Bison's manual довольно подробно.
Сказав это, почему бы не просто использовать сообщения об ошибках вашего компилятора, чтобы узнать, неправильно ли вы написали for-loop?
Для анализа lexical вы можете использовать регулярные выражения или любой из десятков генераторов сканеров (flex/lex, ANTLR). Для синтаксического анализа, с другой стороны, вам, вероятно, понадобится генератор синтаксического анализатора, который мог бы читать грамматику без контекста. Однако из того, что я понимаю, большинство парсеров C++ написаны вручную. Я не уверен, что даже парсер LALR мог бы сделать трюк; вам может понадобиться вытащить большие пушки и использовать что-то вроде поддержки BCR Bison. Кроме того, за тонну больше информации о лексическом/синтаксическом анализе я бы рекомендовал 'The Dragon Book'. Удачи!
Компилятор будет жаловаться очень громко, если вы пишете нелегальный цикл:
for (int i)
получит большую громкую ошибку на каждый компилятор на рынке.
Однако много ошибок «за петлю» совершенно законны.
Я предполагаю, что вы пытаетесь указать законные циклы, которые не означают, что вы хотите, чтобы они имели в виду. Проблема, конечно же, в том, что the compiler has no way of knowing what you mean. Вы можете законно исключить любую из трех частей в цикле, и обычно оставляют все три части. Кроме того, вы можете сделать больше, чем одну вещь в каждой части, а также:
for (int i = 0, MAX_ITERS = 20; ; ++i, --MAX_ITERS) {
if (MAX_ITERS == 0 || i > MAX_ITERS)
break;
if (i % 2 == 0)
continue;
std::cout << i << ',' << MAX_ITERS << '\n';
}
И, конечно же, большинство ошибок цикла совершенно невозможно для компилятора, чтобы найти, например, писать i < 10
, когда вы имеете в виду i <= 10
.
Я подозреваю, что вы не лексический анализатор, который просто смотрит на отдельные токены и является частью компилятора, а скорее статическим анализатором, который смотрит на код и может предлагать потенциальные ошибки. Проверьте эти вопросы:
мне нужно иметь свиная отбивная – Shog9
мне нужно больше информации, чтобы ответить на этот вопрос –
мне нужно пиво. Эй, это 1640, еще 20 минут. Woo HOo! – Adrien