2009-06-09 2 views
-1

Мне нужен простой лексический анализатор, который сообщает о ошибках цикла в C/C++.Где я могу получить лексический анализатор, способный сообщать о ошибках цикла в C или C++?

+5

мне нужно иметь свиная отбивная – Shog9

+1

мне нужно больше информации, чтобы ответить на этот вопрос –

+2

мне нужно пиво. Эй, это 1640, еще 20 минут. Woo HOo! – Adrien

ответ

0

flex/lex и bison/yacc - два хороших инструмента для развития таких вещей. Ошибки в отчетах для цикла будут казаться очень специфическими, что вам нужно, поэтому вам, возможно, придется написать свой собственный лексер и парсер, чтобы он делал то, что вы хотите.

Bison's manual довольно подробно.

Сказав это, почему бы не просто использовать сообщения об ошибках вашего компилятора, чтобы узнать, неправильно ли вы написали for-loop?

0

Для анализа lexical вы можете использовать регулярные выражения или любой из десятков генераторов сканеров (flex/lex, ANTLR). Для синтаксического анализа, с другой стороны, вам, вероятно, понадобится генератор синтаксического анализатора, который мог бы читать грамматику без контекста. Однако из того, что я понимаю, большинство парсеров C++ написаны вручную. Я не уверен, что даже парсер LALR мог бы сделать трюк; вам может понадобиться вытащить большие пушки и использовать что-то вроде поддержки BCR Bison. Кроме того, за тонну больше информации о лексическом/синтаксическом анализе я бы рекомендовал 'The Dragon Book'. Удачи!

2

Компилятор будет жаловаться очень громко, если вы пишете нелегальный цикл:

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.

2

Я подозреваю, что вы не лексический анализатор, который просто смотрит на отдельные токены и является частью компилятора, а скорее статическим анализатором, который смотрит на код и может предлагать потенциальные ошибки. Проверьте эти вопросы:

 Смежные вопросы

  • Нет связанных вопросов^_^