Избегайте комментариев в стиле C при чтении файла - PullRequest
1 голос
/ 31 октября 2009

Я анализирую файл C для LOC в функции, использующей python. Я начинаю с первой строки определения функции и пропускаю все строки, пока не встретил первую "{".

Проблема в том, что "{" также может быть частью комментария. Я просто хочу пропустить все "{" присутствующие внутри комментариев.

* 1005 например *

100: int func(
102:         int i, // some comment { ....
103:         float f,
104:         char c /* some comment here { ...
105:                .... more comment */
106:         )
107:{

Какой лучший питонский способ добиться этого?

Ответы [ 3 ]

7 голосов
/ 01 ноября 2009

Вот стриптизер для комментариев, который также должен понимать вводителей комментариев внутри строк в кавычках:

from pyparsing import cppStyleComment,dblQuotedString

cppStyleComment.ignore(dblQuotedString)
src = cppStyleComment.suppress().transformString(src)

print src

С вашим исходным фрагментом как src, это печатает:

int func(
             int i, 
             float f,
             char c 
             )
    {

Вы можете делать все это в памяти, поэтому вам не нужно сначала создавать файл без комментариев.

3 голосов
/ 31 октября 2009

Вы поймете, что понять это очень сложно без настоящего лексера и парсера.

Это найдет открывающую скобку, которую вы ищете:

f = open("myfile.c")
for l in f.readlines():
    l = l.split('//')[0]
    if '{' in l:
        break

Но, например, у вас могут быть двойные косые черты внутри строковых литералов и т. Д.

0 голосов
/ 31 октября 2009

Если у вас есть gcc, вы можете использовать gcc -E input_file в качестве препроцессора, который будет отбирать комментарии (но также расширять макросы - может изменить LOC). Для вашего примера результат будет:

# 1 "_.c"
# 1 ""
# 1 ""
# 1 "_.c"


 int func(
         int i,
         float f,
         char c

         )
{
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...